の動作は、 R6RSの付録A.3quote
で指定されています。の場合、関連するルールは6sqvです。'1
(store(sf 1 ...)S 1 [ 'sqv 1 ])→(store(sf 1 ...)S 1 [ sqv 1 ])
これを分解する時が来ました。
「S→T」表記は、用語を評価する1つのステップを定義します。ここで、「S」は「T」と評価されます。
store
と非終端記号は左側と右側の両方で同じように見えるので、評価方法を理解するためにそれらを理解する必要はありません。何かが必要な場合は、「ストレージ環境」と名前と値のペアとして考えてください。識別子が値に関連付けられ、用語を評価するときに関連付けられることを意味します。sf1
'1
store
sfn
(store ((x 1) (y 2)) S)
x
1
y
2
S
表記に慣れていない場合は、「穴」が1つある用語(中にaが含まれている用語)を指します。関連する構文要素は2つあります。穴のある用語()と、値で埋められた穴のある用語()です。穴は、名前のない変数のように少し(ただし少しだけ)です。重要な違いの1つは、用語には1つの穴しか許可されないことです。穴はおそらく例によって最もよく説明されます。次のすべては次のとおりです。S[e]
[]
e
S[]
S[e]
S[]
穴は、サブタームが構文的に有効な場合にのみ表示されることに注意してください。[] 2)
穴のある用語ではありません。穴S[0]
に置き換えられた用語になります:0
穴に値が指定されている場合、その用語S[]
は「コンテキスト」とも呼ばれます。これは、穴のある用語の主な用途の1つである、指定された値を含む任意の用語に一致することから生じます。は、有効なサブ用語として含まれるすべての用語であり、に表示されるコンテキストも同様です。つまり、引用符を含むすべての用語の代用です。S[e]
e
S[]
e
S1['sqv1]
2番目の用語はquote-termsに2つの異なるコンテキストを提供することに注意してください:(list [] 'a "foo")
、(list 'bar [] "foo")
。これは、穴を名前のない変数であると考えすぎないようにする必要があることを示しています。
なぜコンテキスト用語と穴が使用されるのか疑問に思われる場合は、再帰的定義の代わりになります。コンテキストがない場合、→は用語の構造に対して再帰的に定義する必要があります(Schemeの文法が構造を定義します)。ラムダ計算での置換は、Schemeで定義する可能性のあるツリー処理関数と同様に、構造的再帰の例です(ただし、Schemeの構文は→およびラムダ計算の置換を定義するために使用される構文とはかなり異なります)。
(define (tree-depth tree)
(if (pair? tree)
(max (tree-depth (car tree))
(tree-depth (cdr tree)))
1
) )
sqv
次に、 「自己引用値」の略である、の意味を調べてみましょう。これは、付録A.2に示されているScheme文法の非終端記号です。
sqv :: = n | #t | #f
n ::=[数字]
sqvは、単なる数値またはブール値です。
まとめると、6sqv評価ルールは、引用符で囲まれた数値またはブール値が数値またはブール値に評価されることを意味します。見積もりは単に破棄されます。
これが宿題にとって意味することは、関数が呼び出される前にサブタームが評価されるため、通常の関数1
との違いがわからないということです。'1
マクロが必要です。
'1
なぜ「評価する1
」とだけ言ってこれらすべてを通過するのですか?まず、「なぜ」と答えるには、「何を」と答えるだけでは不十分です。また、Schemeの正式なセマンティクスの読み方を少し学び、計算理論の概念を味わい、さらに多くの質問につながることで、質問を超えて役立つことを願っています。