rurururururumin’s diary

勉強の備忘録

SICP 1.5

問題 1.5

Ben Bitdiddleは, 彼の対面している解釈系が, 作用的順序の評価を使っているか, 正規順序の評価を使っているか決定するテストを発明した. 次の二つの手続きを定義した:
(define (p) (p))

(define (test x y)
(if (= x 0)
0
y))
彼は次に式
(test 0 (p))
を評価してみた. 作用的順序の評価を使う解釈系で, Benはどういう振舞いを見るか. 正規順序の評価を使う解釈系で, 彼はどういう振舞いを見るか. 説明せよ. (特殊形式ifの評価規則は, 解釈系が正規順序と作用的順序のどちらを使うかに無関係に同じとする: 述語式を最初に評価し, その結果が帰結式と代替式のいずれを評価するかを決める.)

特殊形式と解釈系の働きを見る問題。

#lang racket
(define (p)(p)) ;①pとpを対応付ける

(define (test x y )
(if (= x 0)
0
y))
#|②もし(x=0)だったら0と返す、それ以外はyと返す。    |#

(test 0 (p))   ;③0とpのtest値は?⇒エラー

#|*ノート
①への扱い方が違う
正規順序…完全に展開してからの処理なので、すべて展開されたうえで、特殊形式であるifの働きから条件に合う0が返ってくるはず。


作用的順序…引数を評価してから展開、①が永遠に評価できないから答が返ってこない|#

LISP系は作用的順序を採用しているのでエラー、無限ループになる。