Turner さんの論文 A New Implementation Technique for Applicative Language に関してなのですが、この SK マシンを実装してみたことがあるかた、いらっしゃいますでしょうか?
論文中に、U コンビネータ(引数に関数とリストをとり、リストを car と cdr に分解して apply する)は再帰的に引数を評価する、とあり、また、相互再起のある関数は Y (U ([f] (U ([g] (... のようにコンパイルする、とあるのですが、その通り実装すると、U の引数の評価中にまた U の引数の評価が起き、止まらなくなりました。
U コンビネータをプリミティブとし、car と cdr は U を使って実装していたのですが、これを逆にして U コンビネータは car と cdr に書き換える実装にして再帰的な評価をおこなわないようにし、car と cdr で再帰的な評価が起こるようにしたところ、うまくいきました。
私が何かかんちがいしているのか、論文の通り実装するとハマるのか、相談したいのですが...
真偽値も if も自然数も cons もλ式で表現する、という実装をすればそうなのですが、λ式以外のプリミティブ値を導入しようとすると、イーガな評価が必要になります(たとえば if の条件節とか)。
正確にはコンビネータでなく、U オペレータと言うべきなのかもしれません(論文でコンビネータと言っているので、そのままそう呼んでしまいました)。