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:
ちょっとズル気味ですが、これを元に検討させて下さひ。