web-dev-qa-db-ja.com

クロージャーだけで関数型言語のすべての機能を構築することは可能ですか?

私は新しい関数型言語を作ろうとしています。それは練習用の通訳です。私が知っているように、最も基本的なビルディングブロックはラムダ関数のみであり、それは単なるクロージャです。よくわからないので、自分が正しいのか、何が悪いのか聞いてみたいと思います。

3
Eonil

私はSIOD(Scheme in one Defun)と、スキームとLISPのより簡素化されたバージョンのいくつかを見ていきます。スキームが本当に小さいのは驚くべきことです。関数の構築と約5つの特別なフォームが必要であり、LISPインタープリターがあります。 (高速ではありませんが、機能します)

そしてもちろん、SICP(コンピュータープログラムの構造と解釈)を見てください。mitpressのWebサイトでオンラインで見つけることができます。

3
Zachary K

プリミティブの絶対に最小限のセットが必要な場合は、 SK calculus を使用します。 nlambda 言語を参照してください。

それ以外の場合は、基本的な ラムダ計算 を実装する単純な項書き換えエンジンで十分です。

Update:言及するのを忘れました-どちらの方法でも、アトミックプリミティブとしてクロージャは導入されません。

2
SK-logic

最も純粋な ラムダ計算 では、計算を実行するために必要なのはラムダ関数だけです。アロンゾチャーチは、特別に形成されたラムダの単なる適用が機能する、数値の1つの可能なエンコーディングについて説明しました。

LISPでも、言語全体をラムダから構築できます。主力製品は Y Combinator (PDF警告)です。これを使用すると、匿名の再帰関数を実装できます。その範囲内で、最も基本的なLISP方言を実装するために必要なすべてのフォームを作成できます。

正直なところ、それはすべて私の頭の上にかなりあり、私はまだ頭を包み込もうとしているので、これをひどく虐殺していないことを願っています。 :)

1
greyfade

私が理解しているように、閉鎖は絶対に必要というわけではありません。クロージャは、語彙環境を「修正」するので便利です。引数として送信されるクロージャにはバインドされた変数が含まれているため、それらも送信する必要はありません。クロージャを使用して実行できるタスクは、関数と変数の両方を引数として明示的に送信することにより、クロージャなしで実行できます。コンビネーターの力を考えてみてください。

ラムダとクロージャにより、言語が使いやすく、表現力が高まります。新しい言語のファーストクラス関数を忘れないでください。

0
Scant Roger