一人読書会 「計算機プログラムの構造と解釈」 (2)

一人読書会 「計算機プログラムの構造と解釈」 (1)

1.1.3 組合せの評価

組合せは、以下のように評価される.

  1. 組合せの部分式を評価
  2. 最左の演算子を被演算子に作用させる

これを 作用的順序の評価(applicative-order evaluation) というが、もう一つ、組合せを完全に展開してから演算を行う評価方法を、正規順序の評価(normal-order evaluation) という.

問題 1.5

作用的順序の評価を使う解釈系での振る舞い、正規順序の評価を使う解釈系での振る舞いを説明せよ

>(define (p) (p))
>(define (test x y)
  (if (= x 0)
      0
      y))
>(test 0 (p))

if がショートサーキットであるとするならば、解釈系が、作用的順序であれば、(test 0 (p)) で、最初に x = 0 が評価されて、結果が 0 となり、test の第2引数 (p) は評価されない。

正規順序の評価であれば、まず組合せが展開される段階で、test の第2引数 (p) が無限ループ(?) に陥ってしまう。

・・・ のではないか。

ちなみに、DrScheme で実行すると、結果が返ってこなかった。