継続が分かっちゃったかも
継続の概念そのものは、それなりに分かったつもりでいたんだけど、ニセSchemeに実装できていなかった。
俺のニセSchemeには、変数のスコープはそのものずばりで、Scopeクラスがあるからコピーをとるのは簡単なんだけど、
ニセSchemeのコールスタックが、Javasctriptのコールスタックだったので、
コールスタックはJavascriptのコールスタックにアクセスしないと取り出せなかった(できるのか?)。
それに、プログラムカウンタだって、仮に記憶したとして、どうやって復帰すればいいのかが分からなかった。
そんなこんなで、構文木をバイトコード化すればいいんだな。
つまり、こういう、スタックマシンにすればいいんじゃないかと思う。
時間が少ないから説明足りないけど、メモとして書き残し。
(define fact (lambda (x) (if (eq x 0) 1 (* x (fact (- x 1)))))) (fact 5)
lambda-1: # 引数処理 push 'x define 2 pop #(eq x 2) push 0 ref 'x eq 2 # if jpnil :else put 1 jp :endif :else ref 'x ref 'x put 1 sub ref 'fact call 2 ref 'x ref '* call 2 :endif :eof main: function lambda-1 put 'fact define 2 put 5 ref 'fact call 2 :eof