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

問題5.24

自分の脳内レジスタの性能が悪いのでどうもアセンブラは苦手…
レジスタに番号タグをつけて状態を把握しながら組み立てていった。

(define eceval-operations
  (list (list 'self-evaluating? self-evaluating?)
        ;; 省略
        (list 'cond? cond?)
        (list 'cond-clauses cond-clauses)
        (list 'cond-else-clause? cond-else-clause?)
        (list 'cond-predicate cond-predicate)
        (list 'cond-actions cond-actions)
        (list 'null? null?)
        (list 'car car)
        (list 'cdr cdr)
        ;; 省略
        ))

(define eceval
  (make-machine
    ;; 省略
      eval-dispatch
      ;; 省略
        (test (op cond?) (reg exp))
        (branch (label ev-cond))
      ;; 省略
      ev-cond
        (assign unev (op cond-clauses) (reg exp)) ; cond の本体(cdr exp:1)を取り出して unev:1 に保存する
        (save continue)
        (goto (label ev-cond-loop))
      ev-cond-loop
        (test (op null?) (reg unev)) ; cond の本体(unev:1)が null だった場合
        (branch (label ev-cond-null))
        (assign exp (op car) (reg unev)) ; 最初の節(car unev:1)を exp:2 に保存する
        (test (op cond-else-clause?) (reg exp)) ; exp:2 が else 節の場合
        (branch (label ev-cond-else-clause))
        (save exp) ; (car unev:1) をスタックに退避, exp:2
        (assign exp (op cond-predicate) (reg exp)) ; 述部(car exp:2)を exp:3 に保存
        (save unev) ; unev:1 をスタックに退避
        (save env)
        (assign continue (label ev-cond-decide))
        (goto (label eval-dispatch))
      ev-cond-decide
        (restore env)
        (restore unev) ; unev:1 を回復
        (restore exp) ; exp:2 を回復
        (test (op true?) (reg val))
        (branch (label ev-cond-consequent))
        (assign unev (op cdr) (reg unev)) ; cond の残りの節(cdr unev:1)を unev:2 に保存
        (goto (label ev-cond-loop))
      ev-cond-consequent
        (assign unev (op cond-actions) (reg exp)) ; (cdr exp:2) を unev:3 に保存
        (goto (label ev-sequence))
      ev-cond-else-clause
        (assign unev (op cond-actions) (reg exp)) ; (cdr exp:2) を unev:4 に保存
        (goto (label ev-sequence))
      ev-cond-null
        (restore continue)
        (assign val (const #f))
        (goto (reg continue))
      ;; 省略
      )))

SICP 問題5.24 レジスタの内容

実行結果

;;; EC-Eval input:
(define (zero? x)
  (cond ((> x 0) 'plus)
        ((= x 0) 'zero)
        (else 'minus)))

;;; EC-Eval value:
ok

;;; EC-Eval input:
(zero? 1)

;;; EC-Eval value:
plus

;;; EC-Eval input:
(zero? 0)

;;; EC-Eval value:
zero

;;; EC-Eval input:
(zero? -1)

;;; EC-Eval value:
minus

問題5.25

問題5.25 は以下のサイトのコードを写しても上手く動作しなかった…
どうも、行き詰まってしまったようなのでこの問題はパスする。

2008-02-21 – 4.0Y 8.5/12.3
いろいろてst: SICP問題5.25

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