SICP の第 4 章を読みましたが、最初のセクションにエバリュエーターを実装するための最も重要な機能がリストされているevalことがapplyわかりました。これevalは非常に重要であることは理解していますが、なぜapplyそれほど重要なのでしょうか? apply一部の言語では、Javascript のようにまったくありません。
編集: Javascript に適用がないことについて私が間違っていることについて申し訳ありませんが、無視してください。
SICP(および他の場所)での評価/適用は、評価者の2つの主要な部分を分離することです。最初の部分、つまりeval実行している部分は、コードの構文上の意味への変換を処理していますが、式の型を介してディスパッチする以外はほとんど何も実行していません。この本でわかるようにeval-foo、それぞれに独自の評価ルールがあるため、さまざまな「特殊な形式」にはさまざまなものがあります。
さて、評価者が扱う必要のある最も重要な形式は関数適用です。実際、このフォームにはキーワードがないことが非常に重要です(そうしないと、ごみのapplyスキーム/ Lispコードが表示されます)。代わりに、フォームが既知の特殊なフォームではない(実際の実装では、既知のマクロではない)もので始まる場合、評価者はそれを関数適用と見なします。この時点で、関数呼び出しを評価するには、関数自体(最初の形式)とそのすべての引数を評価してから、最初の値を残りの値に適用する必要があります。evalここでの主な啓蒙の瞬間は、これとの間に大きな違いがあることを認識することですapply-前者は本質的に構文を扱います、ただし後者は値を扱います。
applyちなみに、これをSchemeとLispの実装に組み込まれている関数と混同している人もいます。その関数が言語である必要がある理由は、SICPポイントとはまったく関係ありません(大まかに言って、それなしでは実装できない機能を提供します。これは、実装から言語への反映の形式です)。applySICPエバリュエーターが通訳言語で利用できるようにさえしているとは思いません。より多くの啓蒙を探しているなら、それを行うこと(SICPメタサーキュラーエバリュエーターを取り、解釈さapplyれた言語に追加すること)は、熟考の良い練習になるでしょう。
これは、式に対して関数を実行する方法です。つまり、関数を式に「適用」します。
次のコードに注意してください。
http://mitpress.mit.edu/sicp/code/ch4-mceval.scm (リンク切れ)
Applyは、関数呼び出しを評価します。関数と引数のリストを取ります:(apply fn args)。関数呼び出しをサポートする言語がある場合は、おそらくインタープリターに適用関数があります。SchemeとJavascriptの違いは、Schemeはこの関数をインタープリターだけでなく、解釈されているプログラムにも公開することです。