問題4.31 – SICP(計算機プログラムの構造と解釈)その205
2009年06月21日
問題4.31
この問題は、参考サイト(SICP 4.2.2 Ex. 4.27 Ex. 4.28 Ex. 4.29 Ex. 4.30 Ex. 4.31 – nakayama-blog)の写経で済ませる。
make-procedure
にリーダーマクロを付けて modifier
の状態を可視化する。
(define (make-procedure parameters body env) (define (unmodify a) (if (symbol? a) a (car a))) (define (modifier a) (if (symbol? a) '() (cadr a))) (let ((p (map unmodify parameters)) (m (map modifier parameters))) (list 'procedure #?=p #?=m body env)))
問題4.30 b. の手続き p2
を使って、遅延有りと無しの場合のそれぞれの modifier
の状態を見る。
引数の遅延をさせたプログラムとして実行する場合
(define (p2 x) (define (p (e lazy)) e x) (p (set! x (cons x '(2)))))
実行結果
;;; L-Eval input: (define (p2 x) (define (p (e lazy))) (p (set! x (cons x '(2))))) #?=p #?- (x) #?=m #?- (()) ;;; L-Eval value: ok ;;; L-Eval input: (p2 1) #?=p #?- (e) #?=m #?- (lazy) ;;; L-Eval value: 1
通常のプログラムとして実行する場合
(define (p2 x) (define (p e) e x) (p (set! x (cons x '(2)))))
実行結果
;;; L-Eval input: (define (p2 x) (define (p e)) (p (set! x (cons x '(2))))) #?=p #?- (x) #?=m #?- (()) ;;; L-Eval value: ok ;;; L-Eval input: (p2 1) #?=p #?- (e) #?=m #?- (()) ;;; L-Eval value: (1 2)
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542