問題4.23 – SICP(計算機プログラムの構造と解釈)その196
2009年06月08日
問題4.23
4.1.7節の本文の版の analyze-sequence
と Alysa の版の analyze-sequence
の lambda
式部分にリーダーマクロを設置して実行してみる。
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-procs
が nil
であるために first-proc
である式がそのままかえされる。
Alysa の版では最後に並びを実行する execute-sequence
を含む lambda
式が返される。
並びが2つの場合、4.1.7節の本文の版では loop
手続きから sequentially
手続きを通した lambda
式が返される。
Alysa の版では1つの場合と同様になる。
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542