私は新しい関数型言語を作ろうとしています。それは練習用の通訳です。私が知っているように、最も基本的なビルディングブロックはラムダ関数のみであり、それは単なるクロージャです。よくわからないので、自分が正しいのか、何が悪いのか聞いてみたいと思います。
私はSIOD(Scheme in one Defun)と、スキームとLISPのより簡素化されたバージョンのいくつかを見ていきます。スキームが本当に小さいのは驚くべきことです。関数の構築と約5つの特別なフォームが必要であり、LISPインタープリターがあります。 (高速ではありませんが、機能します)
そしてもちろん、SICP(コンピュータープログラムの構造と解釈)を見てください。mitpressのWebサイトでオンラインで見つけることができます。
プリミティブの絶対に最小限のセットが必要な場合は、 SK calculus を使用します。 nlambda 言語を参照してください。
それ以外の場合は、基本的な ラムダ計算 を実装する単純な項書き換えエンジンで十分です。
Update:言及するのを忘れました-どちらの方法でも、アトミックプリミティブとしてクロージャは導入されません。
最も純粋な ラムダ計算 では、計算を実行するために必要なのはラムダ関数だけです。アロンゾチャーチは、特別に形成されたラムダの単なる適用が機能する、数値の1つの可能なエンコーディングについて説明しました。
LISPでも、言語全体をラムダから構築できます。主力製品は Y Combinator (PDF警告)です。これを使用すると、匿名の再帰関数を実装できます。その範囲内で、最も基本的なLISP方言を実装するために必要なすべてのフォームを作成できます。
正直なところ、それはすべて私の頭の上にかなりあり、私はまだ頭を包み込もうとしているので、これをひどく虐殺していないことを願っています。 :)
私が理解しているように、閉鎖は絶対に必要というわけではありません。クロージャは、語彙環境を「修正」するので便利です。引数として送信されるクロージャにはバインドされた変数が含まれているため、それらも送信する必要はありません。クロージャを使用して実行できるタスクは、関数と変数の両方を引数として明示的に送信することにより、クロージャなしで実行できます。コンビネーターの力を考えてみてください。
ラムダとクロージャにより、言語が使いやすく、表現力が高まります。新しい言語のファーストクラス関数を忘れないでください。