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