secd 資料追加
しつこいがSECD で再帰関数を実行する例が欲しくて探していたら、COMPUT325: SECD Virtual Machine という資料を見つけた。
http://web.cs.ualberta.ca/~greiner/C-325/2004/325/2004/Slides/HandoutPDF/
資料自体はいいのだけど、p35,p36 にある fact の例が微妙に間違っている。アキュームレータ付きで fact を計算している(lambda (n m) ...)のに最後に必ず1を返してる。それじゃ m の意味ない。
多分正しくは以下。
※追記。ちょっと勘違いかもしれない。元のままが正しいかも。
※ADD と + , MPY と * とかは置き換えた。
(secd 's 'e '(NIL LDC 1 CONS LDC 3 CONS LDF (DUM NIL LDF (LDC 0 LD (1 . 1) = SEL (LD (1 . 2) JOIN) (NIL LD (1 . 2) LD (1 . 1) * CONS LD (3 . 2) LD (1 . 1) - CONS LD (2 . 1) AP JOIN) RTN) CONS LDF (NIL LD (2 . 2) CONS LD (2 . 1) CONS LD (1 . 1) AP RTN) RAP RTN) AP . c) 'd)
この fact のコンパイル結果は動く。けど、コンパイルにはちょっと工夫がいるようなので、まだコンパイルはできない。
このあと LispMe のドキュメントを見て、secd では継続が自然に実装できるらしいことを見る。