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)だけ評価されるため.