新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

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 的にはあっている。