Let's start Scheme

2012-09-21

SRFI-49をまじめに検討してみる

きっかけはこの一言
ないのか?ならば最初の処理系になってみようではないか!おぉぉ、燃え上がれ俺の小宇宙!

と、ここまで意気込むのはいいんだけど、このSRFI先頭にマークがあるわけではないし、105のように{}で囲まれているわけでもないのでreader(日本語で書くとleaderと混同しそう)そのものを置き換える必要がある。
確かに、参照実装のGuileではオリジナルのreadをこれように上書きしていたが、Sagittariusではファイルから起動する際はCで書かれたread相当の関数を直接読んでいるので上書きしても嬉しい結果にはならない。むしろ悲しくなる。
また、この面白SRFIを適用したした結果他のファイルに影響があっても嫌だ。となると、リードマクロと同様、適用したファイルのみに働くことが絶対条件かつなんらか既存のreaderを置き換える仕組みが必要になる。

実は腹案が既にあって(朝起きてシャワー浴びてたら思いついた)、ライブラリ自体に一つだけreaderを持たせることを許せば、持っていない場合はデフォルトで持ってる場合はユーザ定義という形で振り分けができそう。多少のオーバヘッドがかかるが、これを入れれば単に面白SRFIのサポートのみではなく、Cで書いたと思ったのにSchemeで実行されているでござる!ということが可能になるかもしれない。(結局ネタだな)
暇なので(これがいけない、ネタがあると飛びついてしまう)、この方針でとりあえず実装してみることにする。

戦うこと小一時間、どうやら俺の小宇宙は斜め上で爆発したらしい。

ということで、0.3.7からはSRFI-49がサポートされます。マジです。こんな感じで使えます。
#!reader=srfi/:49
(import (srfi :49))

define (fac x)
 if (= x 0) 1
  * x
   fac (- x 1)

print
  let
   group
    foo
     + 1 2
    bar
     + 3 4
   + foo bar

print
  fac 10

(print (fac 10))
(srfi-49-load "bar.scm")
注意点としては、最終行に必ず改行がいります。(EOFが空行である必要があります)。また、インデントがずれるとおかしな挙動をします。
正直自分でもこんなもの使うのか?的な感じ満点ですが・・・

2 comments:

Anonymous said...

srfi-49は世界で一番美しいプログラミング言語だと思います
0.3.7でたら是非使ってみたいです

応援しています

kei said...

ありがとうございます!

多分実装が甘いので、使っていただいて(あれば)不具合報告していただけると幸いです。

Post a Comment