3

私はScheme評価の内部を学び始めましたが、準引用、引用解除、評価、および短所の1つの側面-セルは私を混乱させます。あなたが主題に関する良い参考文献を推薦することができれば、私は非常に感謝するでしょう。

R7RSドラフトには、準引用に関するセクション4.2.8にこの例があります。

`(( foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons)))

(これもR4RS仕様に含まれているため、これは新しいことではありません。)

仕様によると、これは次のように評価されます。

((foo 7) . cons)

理由がわからない。私の考えでは、。内部リストの先頭から引用符を削除します。これは、プロシージャとして評価されないことを意味します。

同じ問題を示す簡単な式を次に示します。

`(foo . ,(car '(bar)))

上記と同じロジックを使用すると、これは次のように評価されます。

(foo . bar)

そして実際、それは私が試したSchemeシステムのそれと評価されます。

しかし、私の理解では、それを評価するべきではないので、どこが間違っているのかを調べたいと思います。

スキームの評価についての私の理解は(OK、簡略化)、それが角かっこの後の最初のキーワードである場合、リストの残りの部分をパラメーターとしてそのプロシージャを呼び出します。

仕様についての私の理解は、「、」は次の式を「(引用符で囲まれていない」プロシージャでラップすることとまったく同じです。

ドット表記についての私の理解は、一般的な表示の目的で、ここで説明するように、ドットと開き括弧(および一致する閉じ括弧)を削除することです。

一般に、ペアを印刷するためのルールは次のとおりです。常にドット表記を使用しますが、ドットの直後に開き括弧が続く場合は、ドット、開き括弧、および対応する閉じ括弧を削除します。

それで:

`(foo . ,(car '(bar)))

同様に次のようにレンダリングできます:

(quasiquote (foo unquote (car (quote (bar)))))

(実際、これはjsSchemeがログウィンドウに入力をレンダリングする方法です。)

ただし、これを評価する場合は、次のようになります。

(quasiquote (foo unquote (car (quote (bar)))))

'unquote'が(手順として)評価され、(car ...)リストの引用解除と評価が行われるのはなぜですか?確かに、角かっこの後ではないので、引用記号として扱う必要がありますか?

考えられる答えはいくつか考えられます。「unquote」は通常のプロシージャではなく、「unquote」は通常の評価プロセスの外部で評価されます。「(」以外に呼び出されるプロシージャを示す別の方法があります。手順の記号が続きますが、どちらが正しいか、または詳細を調べる方法がわかりません。

私が見たスキームの実装のほとんどは、評価者と同じ言語ではなくマクロを使用してこれを処理し、何が起こっているのかを理解するのに苦労しています。誰かが説明したり、この主題に関する良い参考資料を見せてくれますか?

4

1 に答える 1

1

関係するマクロがあるという点で正しいです。特に、quasiquoteはマクロでありunquoteunquote-splicingはリテラルです。これらはいずれも手順ではないため、通常の評価ルールは適用されません。

したがって、最初の構文要素ではない(quasiquote (foo bar baz unquote x))にもかかわらず、必要な特別な処理を行うことができます。unquote

于 2012-12-11T01:17:04.423 に答える