読者です 読者をやめる 読者になる 読者になる

fact も cps 変換

とりあえず末尾再帰の fact も cps 変換できるようになった。

(:FIXH
 ((|:FACT0| (FACT0 |sym11| K N RV)
   (:= (N 0) NIL
    ((:RECORD-REF (|sym11| 0) (|sym23|) ((:APP |sym23| (|sym11| RV))))
     (:- (N 1) (|sym17|)
      ((:* (N RV) (|sym16|)
        ((:RECORD-REF (FACT0 0) (|sym24|)
          ((:APP |sym24| (FACT0 |sym11| K |sym17| |sym16|)))))))))))
  (|:FACT| (FACT |sym18| K N)
   (:RECORD-REF (FACT 1) (|sym25|)
    ((:RECORD-REF (|sym25| 1) (FACT0)
      ((:RECORD-REF (FACT0 0) (|sym26|)
        ((:APP |sym26| (FACT0 |sym18| K N 1))))))))))
 (:HEAP ((:LABEL :DUMMY) FACT0) (|sym21|)
  ((:HEAP ((:LABEL |:FACT0|) |sym21|) (FACT0)
    ((:HEAP ((:LABEL |:FACT|) |sym21|) (FACT)
      ((:RECORD-REF (FACT 0) (|sym27|) ((:APP |sym27| (FACT EXIT 10)))))))))))

fact0 は共通じゃなくてもいいのだけど、とりあえず、よしとしましょう。

ついでに互いに呼び合う even と odd

(:FIXH
 ((|:EVEN?| (EVEN? |sym2| X)
   (:RECORD-REF (EVEN? 1) (|sym1|)
    ((:RECORD-REF (|sym1| 2) (ODD?)
      ((:= (X 0) NIL
        ((:RECORD-REF (|sym2| 0) (|sym2|) ((:APP |sym2| (|sym2| :|#T|))))
         (:- (X 1) (|sym7|)
          ((:RECORD-REF (ODD? 0) (|sym3|)
            ((:APP |sym3| (ODD? |sym2| |sym7|)))))))))))))
  (|:ODD?| (ODD? |sym8| X)
   (:RECORD-REF (ODD? 1) (|sym4|)
    ((:RECORD-REF (|sym4| 1) (EVEN?)
      ((:= (X 0) NIL
        ((:RECORD-REF (|sym8| 0) (|sym5|) ((:APP |sym5| (|sym8| :|#T|))))
         (:- (X 1) (|sym13|)
          ((:RECORD-REF (EVEN? 0) (|sym6|)
            ((:APP |sym6| (EVEN? |sym8| |sym13|))))))))))))))
 (:HEAP ((:LABEL :DUMMY) EVEN? ODD?) (|sym0|)
  ((:HEAP ((:LABEL |:EVEN?|) |sym0|) (EVEN?)
    ((:HEAP ((:LABEL |:ODD?|) |sym0|) (ODD?)
      ((:RECORD-REF (EVEN? 0) (|sym7|) ((:APP |sym7| (EVEN? EXIT 997)))))))))))

できたできた。
fact の方に optimize を合わせた方がいいけど(イディオムだから)いまはよしとしましょう。