問題5.42 – SICP(計算機プログラムの構造と解釈)その293
問題5.42 (define (compile exp target linkage ct-env) ;; 省略 ((variable? exp) (compile-variable exp target linkage ct-env)) ;; 省略 (else (error "Unknown expression type — COMPILE" exp)))) (defin…続きを読む
問題5.42 (define (compile exp target linkage ct-env) ;; 省略 ((variable? exp) (compile-variable exp target linkage ct-env)) ;; 省略 (else (error "Unknown expression type — COMPILE" exp)))) (defin…続きを読む
問題5.41 (define (find-variable var ct-env) (define (frame-iter var frames frame-number) (if (null? frames) ‘not-found (let ((addr (scan-iter var (car frames) frame-number 0))) (if (null? addr) (frame-i…続きを読む
問題5.40 (define (compile-lambda-body exp proc-entry ct-env) (let ((formals (lambda-parameters exp))) (append-instruction-sequences (make-instruction-sequence ‘(env proc argl) ‘(env) `(,proc-entry (assi…続きを読む
問題5.39 (define (lexical-address-frame-number lexical-address) (car lexical-address)) (define (lexical-address-displacement-number lexical-address) (cadr lexical-address)) (define (make-lexical-address…続きを読む
問題5.38 a. 及び b. (define (compile exp target linkage) ;; 省略 ((memq (car exp) ‘(+ – * / =)) (compile-open-code exp target linkage)) ;; 省略 (else (error "Unknown expression type — COMPILE" exp)…続きを読む
問題5.37 元の preserving から if の述語部と代替部を取り除く。 (define (preserving regs seq1 seq2) (if (null? regs) (append-instruction-sequences seq1 seq2) (let ((first-reg (car regs))) (preserving (cdr regs) (make-instr…続きを読む
問題5.36 コンパイラは右から左へと被演算子を評価していく。(5.5.3 組み合せの翻訳) 以下は (+ x y) をコンパイルした結果。 被演算子 y の探索が先にきている。 (env) (env proc argl continue val) (assign proc (op lookup-variable-value) (const +) (reg env)) (assign val (o…続きを読む
問題5.35 (parse-compiled-code (compile ‘(define (f x) (+ x (g (+ x 2)))) ‘val ‘next)) 以下は、上記手続きをコンパイルしたもの。 (env) (val) (assign val (op make-compiled-procedure) (label entry1) (reg env)) (goto (label aft…続きを読む
問題5.34 こちらの反復的手続きの factorial では末尾再帰になっている。 一方こちらは再帰的手続きの factorial のコンパイル済みコード。 (env) (val) (assign val (op make-compiled-procedure) (label entry1) (reg env)) (goto (label after-lambda2)) entry1 (assi…続きを読む
問題5.33 factorial と factorial-alt のコンパイル結果を以下に示す。 factorial (env) (val) (assign val (op make-compiled-procedure) (label entry1) (reg env)) (goto (label after-lambda2)) entry1 (assign env (op compiled-p…続きを読む