2008年9月11日木曜日

計算機プログラムの構造と解釈 1.1.6 問題1


このエントリーをはてなブックマークに追加



問題1.4


以下の挙動の確認



(define (a-plus-abs-b a b)
((if (> b 0) + - ) a b ))

(a-plus-abs-b 5 -5)
10

(a-plus-abs-b -5 5)
0



問題1.5


現在使用している処理系が作用的順序の評価なのか、正規順序の評価なのかをテストする手続き。



(define (p) (p))

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

(test 0 (p))



わからん・・・・・。
SICP解答

あ、なるほど。
作用的の場合、演算子、非演算子を先に評価するので(p)が評価されるけれども、
(p)は再帰呼び出しになってるので無限ループして処理が終わらないと。

んで、正規順序。
「完全に展開し、簡約する」と覚えていたんですが、いざ展開しようとするとできませんでした。
自分的には「その値が必要になるまで、被演算子を評価しない」のほうが頭の中で使いやすいようです。
(test 0 (p))

(if (= x 0) 0 (p))
となって、ifが評価されて、(p)の出番がないまま答えがでる、と。

なるほど、なるほど。





0 件のコメント:

コメントを投稿