ニセSchemeで継続させたい
メモです。
今、俺のニセSchemeで継続ができるように頑張っています。
とりあえず、今の実装ではなくスタックマシンライクなバーチャルマシンで
実行すれば上手くいくんじゃないかと思い、
YARVとかFORTHとかを調べて、必死こいて考えています。
そこで問題に気がついたのですが、今のマクロは以下のように書けます。
マクロとラムダをごっちゃにしてもそれなりに動きます。
(define my-or (macro (a b) (list (quote if) a a b))) (map (list my-or ; 1とだけ表示される。戻り値1 (macro (a b) (list (quote if) a b NIL)) ; 1と2が表示される(and)。戻り値2 + ; 1と2が表示され、戻り値3 (lambda (a b) (+ a b)) ; + と同じ (lambda (f) (f (p 1) (p 2))))
ここまで自由だとコンパイルのやりようがない。
なので、実行前にマクロは展開しようと思います。
ついでに文法も変更します。
(defmaco my-or (a b) (list (quote if) a a b)) (my-or NIL T) (list my-or) ; これはとりあえずコンパイルエラーにする。
必ず、マクロの宣言時はマクロの名前を付けるようにして、
コンパイル時のヒントに使う。
(defmacro ...)の戻り値は必ずNILで、(my-or x y)のように名前を参照しないと呼び出せないようにする。
マクロは、変数関数とは違うスコープに格納され、実行時には参照できないことに。
今の実装よりちょっと退化しちゃうけど、しょうがないか。
今は、コンパイラの実装のしやすさ優先にして、自由さはあとから何とかすればいいし。
今週中にマクロの展開はできればいいな。