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 では継続が自然に実装できるらしいことを見る。