問題5.31 – SICP(計算機プログラムの構造と解釈)その282
2009年11月21日
問題5.31
よくわからないので、それぞれの場合のコンパイル結果を載せておく。
コンパイル結果の表示は以下の手続きで見易いように改行させる。
(define (parse-compiled-code lis) (if (not (null? lis)) (begin (if (pair? (caar lis)) (map (lambda (x) (if (symbol? x) (print x) (print " " x))) (car lis)) (print (car lis))) (parse-compiled-code (cdr lis)))))
(parse-compiled-code (compile '(f 'x 'y) 'val 'next))
(env) (env proc argl continue val) (assign proc (op lookup-variable-value) (const f) (reg env)) (assign val (const y)) (assign argl (op list) (reg val)) (assign val (const x)) (assign argl (op cons) (reg val) (reg argl)) (test (op primitive-procedure?) (reg proc)) (branch (label primitive-branch1)) compiled-branch2 (assign continue (label after-call3)) (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch1 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) after-call3
(parse-compiled-code (compile '((f) 'x 'y) 'val 'next))
(env) (env proc argl continue val) (assign proc (op lookup-variable-value) (const f) (reg env)) (assign argl (const ())) (test (op primitive-procedure?) (reg proc)) (branch (label primitive-branch1)) compiled-branch2 (assign continue (label proc-return4)) (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) proc-return4 (assign proc (reg val)) (goto (label after-call3)) primitive-branch1 (assign proc (op apply-primitive-procedure) (reg proc) (reg argl)) after-call3 (assign val (const y)) (assign argl (op list) (reg val)) (assign val (const x)) (assign argl (op cons) (reg val) (reg argl)) (test (op primitive-procedure?) (reg proc)) (branch (label primitive-branch5)) compiled-branch6 (assign continue (label after-call7)) (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch5 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) after-call7
(parse-compiled-code (compile '(f (g 'x) y) 'val 'next))
(env) (env proc argl continue val) (assign proc (op lookup-variable-value) (const f) (reg env)) (save proc) (assign val (op lookup-variable-value) (const y) (reg env)) (assign argl (op list) (reg val)) (save argl) (assign proc (op lookup-variable-value) (const g) (reg env)) (assign val (const x)) (assign argl (op list) (reg val)) (test (op primitive-procedure?) (reg proc)) (branch (label primitive-branch1)) compiled-branch2 (assign continue (label after-call3)) (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch1 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) after-call3 (restore argl) (assign argl (op cons) (reg val) (reg argl)) (restore proc) (test (op primitive-procedure?) (reg proc)) (branch (label primitive-branch4)) compiled-branch5 (assign continue (label after-call6)) (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch4 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) after-call6
(parse-compiled-code (compile '(f (g 'x) 'y) 'val 'next))
(env) (env proc argl continue val) (assign proc (op lookup-variable-value) (const f) (reg env)) (save proc) (assign val (const y)) (assign argl (op list) (reg val)) (save argl) (assign proc (op lookup-variable-value) (const g) (reg env)) (assign val (const x)) (assign argl (op list) (reg val)) (test (op primitive-procedure?) (reg proc)) (branch (label primitive-branch1)) compiled-branch2 (assign continue (label after-call3)) (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch1 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) after-call3 (restore argl) (assign argl (op cons) (reg val) (reg argl)) (restore proc) (test (op primitive-procedure?) (reg proc)) (branch (label primitive-branch4)) compiled-branch5 (assign continue (label after-call6)) (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch4 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) after-call6
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542