さかもとのブログ

つらつらと

SICP演習問題4.27

”演習問題”ではなく”問題”であることに気がついた.
最後まで”演習問題”で行くw

さてさて,4.2に入りました.遅延評価です.

;exercise4.27
;with Lazy
;;; L-Eval input:
(define count 0)

;;; L-Eval value:
ok

;;; L-Eval input:
(define (id x)
  (set! count (+ count 1))
  x)

;;; L-Eval value:
ok

;;; L-Eval input:
(define w (id (id 10)))

;;; L-Eval value:
ok

;;; L-Eval input:
count

;;; L-Eval value:
1

;;; L-Eval input:
w

;;; L-Eval value:
10

;;; L-Eval input:
count

;;; L-Eval value:
2

同じことを作用的順序でやると,

gosh> (define count 0)
count
gosh> (define (id x)
        (set! count (+ count 1))
        x)
id
gosh> (define w (id (id 10)))
w
gosh> count
2
gosh> w
10

作用的順序では,wが定義された時点で,(id (id 10))が評価され,countが2になっているが,
正規順序(遅延評価)では,wが評価された時点で,countが2になる.
正規順序で,wが評価される前に,countが1になるのは,(id (id 10))の(id 10)だけ評価されるため.