SICP 読み (189) 4.2.2 遅延評価の解釈系

問題 4.30 は降参気味。仕方が無いのでわし的評価器に聞いてみた。

;;; L-Eval input:
(define (for-each proc items)
(if (null? items)
'done
(begin (proc (car items))
(for-each proc (cdr items)))))

;;; L-Eval value:
ok

;;; L-Eval input:
(for-each (lambda (x) (newline) (display x)) (list 57 321 88))

57
321
88
;;; L-Eval value:
done

;;; L-Eval input:

なんじゃそりゃ。Cy な提案のソレは正しく動作しないのか、と安易に試験してみたんですが動いとるやんけ。訳分からんのぅ、と言いつつ先に目を通すと c において「a の例の振舞いに影響しないと指摘」とある。とほほほほ。
ここでのカギは b の設問だろうか。とりあえず全然ワケワカなんで b で例示されているソレを評価器に吸わせてみる。まず、元の版から。

;;; L-Eval input:
(define (p1 x)
  (set! x (cons x '(2)))
  x)

;;; L-Eval value:
ok

;;; L-Eval input:
(define (p2 x)
  (define (p e)
    e
    x)
  (p (set! x (cons x '(2)))))

;;; L-Eval value:
ok

;;; L-Eval input:
(p1 1)

;;; L-Eval value:
(1 2)

;;; L-Eval input:
(p2 1)

;;; L-Eval value:
1

;;; L-Eval input:

うーん。次に Cy 版。

;;; L-Eval input:
(define (p1 x)
  (set! x (cons x '(2)))
  x)

;;; L-Eval value:
ok

;;; L-Eval input:
(define (p2 x)
  (define (p e)
    e
    x)
  (p (set! x (cons x '(2)))))

;;; L-Eval value:
ok

;;; L-Eval input:
(p1 1)

;;; L-Eval value:
(1 2)

;;; L-Eval input:
(p2 1)

;;; L-Eval value:
(1 2)

;;; L-Eval input:

ちょっとズル気味ですが、これを元に検討させて下さひ。