lisp処理系ぽいの書いてみたり(その2くらい)

Schemeタグ付けるようなもんかよと思いつつ。syntaxぽいのもできるようにしてみた。ユーザ側から関数とかsyntax定義できないから意味無いけど。
ソースこのへん http://konbu.s13.xrea.com/lib/scm/istsp.d

> (define a (+ 10 20 (* 3 8) (/ 9 3)))
57
> a
57
> (if (not #f) (print 100) (print 200))
100
#undef
> (if (not #t) (print 100) (print 200))     
200
#undef
> ((if #f + *) 3 4)
12

処理系書いてて気付いた。

gosh> (+ . ())
0
gosh> (+ 3 4 . ())
7

なるほど。S式はリストでコンスセルなんだよなやっぱり。Schemeを触り初めたとき '(3 4) がリストになったり、'(3 . 5) がコンスセルになったりするのは (list 3 4) とか (cons 3 5) の略記法なのかと思ってたけどそうじゃない。評価してないだけなんだなホント。

null?の実体はop_nullp、consの実体がop_consだったりするんだけど、今は関数の形を

Cell op_nullp();

な形で、引数はMachineのargsスタックから取って、op_consの結果はreturnで返すとかやってる。なんつか歪だ。たぶん全部argsスタックの中に閉じこめて値のやりとりをするようにした方が、後々楽になる気がする。全部

void op_nullp();

な形に書き換えよう。

test