問題5.32 – SICP(計算機プログラムの構造と解釈)その283
問題5.32 a. (define eceval (make-machine ;; 省略 ev-application (save continue) (assign unev (op operands) (reg exp)) (assign exp (op operator) (reg exp)) (test (op symbol?) (reg exp)) (branch (label ev-o…続きを読む
問題5.32 a. (define eceval (make-machine ;; 省略 ev-application (save continue) (assign unev (op operands) (reg exp)) (assign exp (op operator) (reg exp)) (test (op symbol?) (reg exp)) (branch (label ev-o…続きを読む
問題5.31 よくわからないので、それぞれの場合のコンパイル結果を載せておく。 コンパイル結果の表示は以下の手続きで見易いように改行させる。 (define (parse-compiled-code lis) (if (not (null? lis)) (begin (if (pair? (caar lis)) (map (lambda (x) (if (symbol? x) (print x) …続きを読む
いよいよ、最後の5.5節。 コンパイラを作ってプログラムを走らせる方法を調べる。 今回も問題を解く前に、動作するコンパイラを作っておく。 作るといっても書き写すだけ。そのまま、修正の必要もなく動作した。 ;;;; 5.5.1 翻訳系の構造 ;;; 翻訳系のトップレベルの振り分け処理 compile (define (compile exp target linkage) (cond ((self-…続きを読む
問題5.30 a. これまで、未束縛の変数があった場合は基盤の scheme のエラーを発生させていたために、評価器の駆動ループが終了されて基盤の scheme に戻ってしまっていた。 これを、未束縛の変数の存在を捕捉し評価器の駆動ループ内で処理させるように変更する。 ;;; EC-Eval input: (+ x 2) *** ERROR: Unbound variable x Stack Tr…続きを読む
問題5.29 ;;; EC-Eval input: (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) (total-pushes = 3 maximum-depth = 3) ;;; EC-Eval value: ok ;;; EC-Eval input: (fib 3) (total-pushes = 128 m…続きを読む
問題5.28 評価器を末尾再帰的でないように ev-sequence を変更(p333)し、それぞれの版の factorial を実行する。 反復的手続きの場合 ;;; EC-Eval input: (define (factorial n) (define (iter product counter) (if (> counter n) product (iter (* counter p…続きを読む
問題5.27 再帰的 factorial でのスタックの最大深さとプッシュ総数を調べる。 ;;; EC-Eval input: (define (factorial n) (if (= n 1) 1 (* (factorial (- n 1)) n))) (total-pushes = 3 maximum-depth = 3) ;;; EC-Eval value: ok ;;; EC-Eval i…続きを読む
問題5.26 反復的手続きの factorial を使った各値の n! の計算に使うスタックの最大深さとプッシュの回数の結果。 ;;; EC-Eval input: (define (factorial n) (define (iter product counter) (if (> counter n) product (iter (* counter product) (+ counte…続きを読む
問題5.24 自分の脳内レジスタの性能が悪いのでどうもアセンブラは苦手… レジスタに番号タグをつけて状態を把握しながら組み立てていった。 (define eceval-operations (list (list ‘self-evaluating? self-evaluating?) ;; 省略 (list ‘cond? cond?) (list ‘cond-clauses cond-…続きを読む
問題5.23 最初 cond と let の eval-dispatch での配置を application よりも後にしていた為にエラーとなって動かなかった。 (define eceval-operations (list (list ‘self-evaluating? self-evaluating?) ;; 省略 (list ‘cond? cond?) (list ‘cond->if …続きを読む