問題4.31 – SICP(計算機プログラムの構造と解釈)その205

問題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)
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»