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 を合わせた方がいいけど(イディオムだから)いまはよしとしましょう。