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

問題4.23

4.1.7節の本文の版の analyze-sequence と Alysa の版の analyze-sequencelambda 式部分にリーダーマクロを設置して実行してみる。

4.1.7節の本文の版の analyze-sequence

(define (analyze-sequence exps)
  (define (sequentially proc1 proc2)
    #?=(lambda (env) (proc1 env) (proc2 env)))
  (define (loop first-proc rest-procs)
    (if (null? rest-procs)
        first-proc
        (loop (sequentially first-proc (car rest-procs))
              (cdr rest-procs))))
  (let ((procs (map analyze exps)))
       (if (null? procs)
           (error "Empty sequence -- ANALYZE"))
       (loop (car procs) (cdr procs))))

Alysa の版の analyze-sequence

(define (analyze-sequence exps)
  (define (execute-sequence procs env)
    (cond ((null? (cdr procs)) ((car procs) env))
          (else ((car procs) env)
                (execute-sequence (cdr procs) env))))
  (let ((procs (map analyze exps)))
       (if (null? procs)
           (error "Empty sequence -- ANALYZE"))
       #?=(lambda (env) (execute-sequence procs env))))

4.1.7節の本文の版での実行結果

;;; M-Eval input:
(begin (+ 1 1))

;;; M-Eval value:
2

;;; M-Eval input:
(begin (+ 1 1) (+ 1 2))
#?="./eval_with_analyze.scm":163:(lambda (env) (proc1 env) (proc2 env))
#?-    #<closure (analyze-sequence sequentially)>

;;; M-Eval value:
3

;;; M-Eval input:
(begin (+ 1 1) (+ 1 2) (+ 1 3))
#?="./eval_with_analyze.scm":163:(lambda (env) (proc1 env) (proc2 env))
#?-    #<closure (analyze-sequence sequentially)>
#?="./eval_with_analyze.scm":163:(lambda (env) (proc1 env) (proc2 env))
#?-    #<closure (analyze-sequence sequentially)>

;;; M-Eval value:
4

;;; M-Eval input:
(begin (+ 1 1) (+ 1 2) (+ 1 3) (+ 1 4))
#?="./eval_with_analyze.scm":163:(lambda (env) (proc1 env) (proc2 env))
#?-    #<closure (analyze-sequence sequentially)>
#?="./eval_with_analyze.scm":163:(lambda (env) (proc1 env) (proc2 env))
#?-    #<closure (analyze-sequence sequentially)>
#?="./eval_with_analyze.scm":163:(lambda (env) (proc1 env) (proc2 env))
#?-    #<closure (analyze-sequence sequentially)>

;;; M-Eval value:
5

Alysa の版での実行結果

;;; M-Eval input:
(begin (+ 1 1))
#?="./sicp-ex4.23.scm":169:(lambda (env) (execute-sequence procs env))
#?-    #<closure (analyze-sequence analyze-sequence)>

;;; M-Eval value:
2

;;; M-Eval input:
(begin (+ 1 1) (+ 1 2))
#?="./sicp-ex4.23.scm":169:(lambda (env) (execute-sequence procs env))
#?-    #<closure (analyze-sequence analyze-sequence)>

;;; M-Eval value:
3

;;; M-Eval input:
(begin (+ 1 1) (+ 1 2) (+ 1 3))
#?="./sicp-ex4.23.scm":169:(lambda (env) (execute-sequence procs env))
#?-    #<closure (analyze-sequence analyze-sequence)>

;;; M-Eval value:
4

;;; M-Eval input:
(begin (+ 1 1) (+ 1 2) (+ 1 3) (+ 1 4))
#?="./sicp-ex4.23.scm":169:(lambda (env) (execute-sequence procs env))
#?-    #<closure (analyze-sequence analyze-sequence)>

;;; M-Eval value:
5

並びが1つの場合、4.1.7節の本文の版では loop 手続きで rest-procsnil であるために first-proc である式がそのままかえされる。
Alysa の版では最後に並びを実行する execute-sequence を含む lambda 式が返される。
並びが2つの場合、4.1.7節の本文の版では loop 手続きから sequentially 手続きを通した lambda 式が返される。
Alysa の版では1つの場合と同様になる。

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