exercise 4.27~28

exercise 4.27

なんか似たようなのを3章でやったなぁ・・・、と思ったらfootnoteにかいて
あったか。

とりあえず結果は

;;; L-Eval input:
count

;;; L-Eval value:
1

;;; L-Eval input:
w

;;; L-Eval value:
10

;;; L-Eval input:
count

;;; L-Eval value:
2

wの定義した段階でidがactual-valueでよばれるので、countは1。
その後wをdriver-loopからよぶと、二つめのidもよばれるのでcountは2に。
これ以降ははメモ化が働くのでcountの値はかわらない。
(メモ化が働いていないと、wよ呼ぶごとにcountの値が1ずつ増えてく)


しかし何かここら辺の動きが怪しいなぁ。問題といていけばはっきりすると良
いのだが。

exercise 4.28

とりあえず実際にactual-valueからevalに変更してみる。
これが問題となるのは、operatorの中にthunkがまじってるとき。
例えば、

(define (double f)
  (lambda (x) (f (f x))))

(define (square n) (* n n))

(define fourth-power (double square))

を試してみると、

;;; L-Eval input:
(fourth-power 2)
*** ERROR: Unknown procedure type -- APPLY #0=(thunk square #1=(((fourth-power square double false true car cdr cons null? eq? + - * / = > < display newline not remainder assoc cadr) (procedure #2=(x) #3=((f (f x))) ((#4=(f) #0#) . #1#)) (procedure (n) ((* n n)) #1#) (procedure #4# ((lambda #2# . #3#)) #1#) #f #t (primitive #<subr car>) (primitive #<subr cdr>) (primitive #<subr cons>) (primitive #<subr null?>) (primitive #<subr eq?>) (primitive #<subr +>) (primitive #<subr ->) (primitive #<subr *>) (primitive #<subr />) (primitive #<subr =>) (primitive #<subr >>) (primitive #<subr <>) (primitive #<subr display>) (primitive #<subr newline>) (primitive #<subr not>) (primitive #<subr remainder>) (primitive #<subr assoc>) (primitive #<subr cadr>))))
Stack Trace:

となってエラー。
doubleの引数はthunkになってるのに、関数呼びだしを行ってthunkなやつに数値を適用しちゃおかしく
なるわな。
ってことでいいのかな?この現象は。
要するにoperatorにthunkが入りこんだときを考えてのactual-valueなんかね。