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

問題4.2

a.

gosh> (load "./hoge.scm")
#t
gosh> (driver-loop)


;;; M-Eval input:
(define x 3)
*** ERROR: Unbound variable define
Stack Trace:
_______________________________________
  0  (eval (operator exp) env)
        At line 36 of "./hoge.scm"
  1  (eval input the-global-environment)
        At line 346 of "./hoge.scm"
gosh>

b.

application?assignment? の前に持ってきて、application? の定義を tagged-list? を使ったものに変更する。
式の演算子・被演算子の前に call が追加されるので、operatoroperands 手続きも変更する。

(define (eval exp env)
  (cond ((self-evaluating? exp) exp)
        ((variable? exp) (lookup-variable-value exp env))
        ((quoted? exp) (text-of-quotation exp))
        ((application? exp)
         (apply (eval (operator exp) env)
                (list-of-values (operands exp) env)))
        ((assignment? exp) (eval-assignment exp env))
        ((definition? exp) (eval-definition exp env))
        ((if? exp) (eval-if exp env))
        ((lambda? exp)
         (make-procedure (lambda-parameters exp)
                         (lambda-body exp)
                         env))
        ((begin? exp)
         (eval-sequence (begin-actions exp) env))
        ((cond? exp) (eval (cond->if exp) env))
        (else
          (error "Unknown expression type -- EVAL" exp))))

(define (application? exp) (tagged-list? exp 'call))

(define (operator exp) (cadr exp))

(define (operands exp) (cddr exp))
...
(define primitive-procedures
  (list (list 'car car)
        (list 'cdr cdr)
        (list 'cons cons)
        (list 'null? null?)
        (list '+ +) ;; + を追加
        ;; 基本手続きが続く
        ))

実行結果

gosh> (load "./hoge.scm")
#t
gosh> (driver-loop)


;;; M-Eval input:
(call + 1 2)

;;; M-Eval value:
3

;;; M-Eval input:
(+ 1 2)
*** ERROR: Unknown expression type -- EVAL (+ 1 2)
Stack Trace:
_______________________________________
  0  (eval input the-global-environment)
        At line 348 of "./hoge.scm"
gosh>
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»