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();
な形に書き換えよう。