私はAbelsonとSussman( コンピュータプログラムの構造と解釈 )を使用していますが、通常の注文評価を使用する場合と、アプリケーション注文評価を使用する場合について少し混乱しています。
この文は私を捨てます:
LISPは適用順序評価を使用するこれは、(+ 5 1)および( * 5 2)上記、さらに重要なことに、置換によってモデル化できる手続きの領域を離れると、通常の順序の評価は処理がはるかに複雑になるためです。 【強調追加】
on 17ページの段落1 。
ただし、演習1.6では、LISPはプリミティブには通常の順序評価を使用しますが、複雑な手順には適用可能な順序評価を使用します。
誰かが明確にできますか?
まず、LISPには複数の実装があり、それぞれに異なる評価モデルがある場合があります。 SICPは主にSchemeを使用していると思います。
演習1.6はnotを使用して、Schemeが通常の順序を使用することを示唆しています-特別な形式(if
)についてです。特殊なフォームの場合、評価は適用可能でも通常でもありません。
特別なフォームの場合を除いて、Schemeは常に適用順序を使用すると思います。
例えば:
(cond (x 1)
(y 2)
(else 3))
cond
は特別な形式です。これはx
を評価して評価し、真の場合は1を返し、そうでない場合はy
を評価し、真の場合は2を返し、それ以外の場合は3を返します。
私はスキームに少し錆びています-括弧を忘れなかったことを願っています!また、Schemeには複数のバージョンがあることも承知していますが、どのバージョンがこの本で使用されているかはわかりません。
通常の順序の評価は、置換によってモデル化できる手続きの領域を離れると、処理がはるかに複雑になるためです。
言い換えると、
let x = (print "ha", print "ho") in x
問題は、これはa)何もない、b)ha c)ho d)hahoですか?
これは初めてだけですか、それともxが使用されるたびですか?
通常の順序評価では、次のように、要求された式の量に依存します。
y = fst x
これは、厳密でない言語(つまり、正規表現評価の形式を使用して、canが置換によってモデル化される)が純粋になる傾向がある理由の1つです。つまり、式での副作用は許可されません。