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

test