eta(η) reduction
((:fix ((even? (x) (:if (:= x 0) :#t (odd? (:- x 1)))) (odd? (x) (:if (:= x 0) :#t (even? (:- x 1))))) (even? 997)))
典型的な交互に呼び合う非効率であるけど偶数奇数判定機。cps 変換すると
(:FIXH ((EVEN? (|sym2| X) (:FIXS ((|sym3| (|sym4|) (:APP |sym2| (|sym4|)))) (:= (X 0) NIL ((:APP |sym3| (:|#T|)) (:- (X 1) (|sym7|) ((:FIXS ((|sym5| (|sym6|) (:APP |sym3| (|sym6|)))) (:APP ODD? (|sym5| |sym7|))))))))) (ODD? (|sym8| X) (:FIXS ((|sym9| (|sym10|) (:APP |sym8| (|sym10|)))) (:= (X 0) NIL ((:APP |sym9| (:|#T|)) (:- (X 1) (|sym13|) ((:FIXS ((|sym11| (|sym12|) (:APP |sym9| (|sym12|)))) (:APP EVEN? (|sym11| |sym13|)))))))))) (:FIXS ((|sym14| (|sym15|) (:APP EXIT (|sym15|)))) (:APP EVEN? (|sym14| 997))))
勝手に exit とかいれられちゃう。まぁ非効率なコードをつくる。
で eta reduction
η
(:FIXH ((EVEN? (|sym2| X) (:= (X 0) NIL ((:APP |sym2| (:|#T|)) (:- (X 1) (|sym7|) ((:APP ODD? (|sym2| |sym7|))))))) (ODD? (|sym8| X) (:= (X 0) NIL ((:APP |sym8| (:|#T|)) (:- (X 1) (|sym13|) ((:APP EVEN? (|sym8| |sym13|)))))))) (:APP EVEN? (EXIT 997)))
スリム化されます。
(exit 997) が妙だけど、cps 的にはあっている。