MiniSchemeをD言語で書いてみたよ、と。
ちょーみじかいScheme処理系として有名なMiniSchemeをDに移植した。たぶん動く。
http://konbu.s13.xrea.com/lib/scm/miniscm-d-20070815.tar.bz2
ほとんどそのまま移しただけ。やったのは、先日の日記に書いたScheme関数に対応する関数を書いたことと、GCまわりのコードをばっさり削ったのと、char*でほげほげしてた部分をchar[]でほげほげするようにした、くらい。ああ、あとバグをたくさん仕込んだんじゃないかなきっと。
% ./dminiscm Mini-Scheme Interpreter written by D Version pre alpha1 loading init.scm nil t caar cadr cdar cddr caaar caadr cadar caddr cdaar cdadr cddar cdddr call/cc list map for-each list-tail list-ref last-pair head tail quasiquote atom? memq equal? do > (define (fact x) (if (= x 0) 1 (* x (fact (- x 1))))) fact > (fact 5) 120 > (define (f) (call/cc (lambda (escape) (begin (display 1) (newline) (display 2) (newline) (escape 10) (display 3) (newline))))) f > (f) 1 2 10 >
call/ccもできてるわーすごい。どうやって実装してんのかは全然理解してないんですけど。あともちろん
> 3.0 Error: Unbounded variable 3.0 >
浮動小数点数はサポートしていません。ほんとにMiniSchemeをそのままDで書いただけ。
Dのプログラムとしては、たぶんおもしろいことはなんもしてません。どっちかっつーと、MiniSchemeのコードの理解を深めるためにやった。D的なコードへの書き換えとか、機能の追加とかはこれから。たぶんやる。
驚異の情報科学若手の会効果
「情報科学の人が集まるような所に行くんだから、恥ずかしくないようになんかしなきゃ!」と焦ったおかげでMiniSchemeのDへの移植速度が倍増した。これで「Schemeの処理系を書いたこととかあります」とかハッタリを言えます。ほとんど嘘ですけど。やったのは、プログラムによる自動変換レベルのC->D移植。
それにしても、参加する前から効果があるなんてびっくりですね!
はやみずさんに感謝します。会場ではsuu-gさんとはやみずさん礼賛でもしてようかなと思います。
俺が参加を躊躇う理由はsuu-gさんの後者の理由ですね。「俺なんかが参加してどこかの有能な人とか、将来有望な若者が参加できなくなったりしたら申し分けないじゃないか」と。「実力不足が恥ずかしい」は、たぶん無いかな。俺が実力不足で学力も努力も不足してるなんてのは、自明のことだから、今さら恥ずかしがるとかねーかなー、みてーな。留年したりほげしたりぴよしたりする過程で、「ひらきなおる」ということを憶えました。
なんか発表とかもしたいけど、発表することとか思いつかねえなあ。少しでもネタになりそうな俺の中にある知識っつったら、Java2D->Postscript変換とか、MiniSchemeのこととかくらいだろか。「3分でできるLisp処理系」とかそういうのやろうか。できねえよ。