web-dev-qa-db-ja.com

通常注文評価-対アプリケーション注文評価

私はAbelsonとSussman( コンピュータプログラムの構造と解釈 )を使用していますが、通常の注文評価を使用する場合と、アプリケーション注文評価を使用する場合について少し混乱しています。

この文は私を捨てます:

LISPは適用順序評価を使用するこれは、(+ 5 1)および( * 5 2)上記、さらに重要なことに、置換によってモデル化できる手続きの領域を離れると、通常の順序の評価は処理がはるかに複雑になるためです。 【強調追加】

on 17ページの段落1

ただし、演​​習1.6では、LISPはプリミティブには通常の順序評価を使用しますが、複雑な手順には適用可能な順序評価を使用します。

誰かが明確にできますか?

7
Jonathan Henson

まず、LISPには複数の実装があり、それぞれに異なる評価モデルがある場合があります。 SICPは主にSchemeを使用していると思います。

演習1.6はnotを使用して、Schemeが通常の順序を使用することを示唆しています-特別な形式(if)についてです。特殊なフォームの場合、評価は適用可能でも通常でもありません。

特別なフォームの場合を除いて、Schemeは常に適用順序を使用すると思います。

例えば:

(cond (x 1)
      (y 2)
      (else 3))

condは特別な形式です。これはxを評価して評価し、真の場合は1を返し、そうでない場合はyを評価し、真の場合は2を返し、それ以外の場合は3を返します。


私はスキームに少し錆びています-括弧を忘れなかったことを願っています!また、Schemeには複数のバージョンがあることも承知していますが、どのバージョンがこの本で使用されているかはわかりません。

7
user39685

通常の順序の評価は、置換によってモデル化できる手続きの領域を離れると、処理がはるかに複雑になるためです。

言い換えると、

let x = (print "ha", print "ho") in x

問題は、これはa)何もない、b)ha c)ho d)hahoですか?

これは初めてだけですか、それともxが使用されるたびですか?

通常の順序評価では、次のように、要求された式の量に依存します。

y = fst x

これは、厳密でない言語(つまり、正規表現評価の形式を使用して、canが置換によってモデル化される)が純粋になる傾向がある理由の1つです。つまり、式での副作用は許可されません。

0
Ingo