ニセ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)のように名前を参照しないと呼び出せないようにする。
マクロは、変数関数とは違うスコープに格納され、実行時には参照できないことに。


今の実装よりちょっと退化しちゃうけど、しょうがないか。
今は、コンパイラの実装のしやすさ優先にして、自由さはあとから何とかすればいいし。
今週中にマクロの展開はできればいいな。