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的なコードへの書き換えとか、機能の追加とかはこれから。たぶんやる。