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

問題4.33

元の評価器でのクォート式の実行結果

;;; L-Eval input:
(define (cons x y)
  (lambda (m) (m x y)))

;;; L-Eval value:
ok

;;; L-Eval input:
(define (car z)
  (z (lambda (p q) p)))

;;; L-Eval value:
ok

;;; L-Eval input:
(define (cdr z)
  (z (lambda (p q) q)))

;;; L-Eval value:
ok

;;; L-Eval input:
(car '(a b c))
*** ERROR: Unknown procedure type -- APPLY (a b c)
Stack Trace:
_______________________________________
  0  (eval exp env)
        At line 55 of "./eval_with_delay.scm"
  1  (actual-value input the-global-environment)
        At line 424 of "./eval_with_delay.scm"

text-of-quotation の引数に環境 env を渡す。
クォート式がリストの場合は make-quotation-list を使って、新しい定義の cons でリストを作り直す。

(define (eval exp env)
  (cond ((self-evaluating? exp) exp)
        ;; 省略
        ((quoted? exp) (text-of-quotation exp env))
        ;; 省略
        (else
          (error "Unknown expression type -- EVAL" exp))))

(define (text-of-quotation exp env)
  (if (list? (cadr exp))
      (eval (make-quotation-list (cadr exp)) env)
      (cadr exp)))

(define (make-quotation-list lis)
  (if (null? lis)
      '()
      (let ((first-list (car lis))
            (rest-list (cdr lis)))
           (list 'cons (list 'quote first-list) (make-quotation-list rest-list)))))

新しい評価器でのクォート式の実行結果

;;; L-Eval input:
(define (cons x y)
  (lambda (m) (m x y)))

;;; L-Eval value:
ok

;;; L-Eval input:
(define (car z)
  (z (lambda (p q) p)))

;;; L-Eval value:
ok

;;; L-Eval input:
(define (cdr z)
  (z (lambda (p q) q)))

;;; L-Eval value:
ok

;;; L-Eval input:
(car '(a b c))

;;; L-Eval value:
a

問題4.34

パス

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