私は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」は通常の評価プロセスの外部で評価されます。「(」以外に呼び出されるプロシージャを示す別の方法があります。手順の記号が続きますが、どちらが正しいか、または詳細を調べる方法がわかりません。
私が見たスキームの実装のほとんどは、評価者と同じ言語ではなくマクロを使用してこれを処理し、何が起こっているのかを理解するのに苦労しています。誰かが説明したり、この主題に関する良い参考資料を見せてくれますか?