さかもとのブログ

つらつらと

SICP

SICP終了

SICP終了します。最後の問題がいくつか残っているけれど、とりあえずこれでいったん終えます。初めのほうはここには記録を残していないので、いつ始めたかわからない...と思ったらノートに 日付が!4月25日に始めたようです。 SICPによって得られたもの... S…

SICP演習問題5.48

演習問題を少し飛ばして,5.48です. しかもかなり適当...一応EC-EVALから,compile-and-goを呼び出せますが,compile-and-goを呼び出す度に,ecevalを初期化してしまうので,コンパイル済みコードは1つしか環境に登録できませんw 方法は至って簡単.eceval…

SICP演習問題5.42

(define (found? var) (if (not (eq? var 'not-found)) var false)) (define (compile-variable exp target linkage compile-time-env) (let ((found (found? (find-variable exp compile-time-env)))) (end-with-linkage linkage (make-instruction-sequenc…

SICP演習問題5.41

(define (first-frame env) (car env)) (define (first-variable frame) (car frame)) (define (find-variable variable env) (let ((frame-num 0) (variable-num 0)) (define (scan-frame env) (if (null? env) '() (let ((frame (first-frame env))) (if (…

SICP演習問題5.40

コード生成関数のすべてに翻訳時環境を追加。(コードは略) (define (compile-lambda-body exp proc-entry compile-time-env) (let ((formals (lambda-parameters exp))) (print "compile-time-environment: "compile-time-env) (append-instruction-sequence…

SICP演習問題5.39

たいぶおかしなコードですがお許しください。 (define (search-frame frame-num env) (define (scan-frame count env) (cond ((null? env) (error "search-frame" frame-num env)) ((= count frame-num) (car env)) (else (scan-frame (+ count 1) (cdr env)…

演習問題5.40について

め、め、め、めんどーだ.......コード生成関数のすべてに翻訳時環境を追加するって...

SICP演習問題5.35

今回は,載っている翻訳済のコードを生み出すような式をもとめよ,という問題 翻訳済のコードは以下のもの.(SICPのサイトより抜粋) (assign val (op make-compiled-procedure) (label entry16) (reg env)) (goto (label after-lambda15)) entry16 (assign e…

SICP演習問題5.34

factorialの反復的プロセス版を翻訳する (print-after-compiler (compile '(define (factorial n) (define (iter product counter) (if (> counter n) product (iter (* counter product) (+ counter 1)))) (iter 1 1)) 'val 'next)) 結果 (env) (val) (assi…

SICP演習問題5.33

昨日のprint用の関数を少し直した. (define (print-after-compiler proc) (newline) (for-each (lambda (x) (if (not (pair? (car x))) (print x) (for-each (lambda (y) (if (symbol? y) (print y) (print " "y))) x))) proc)) 今回の問題は (define (fact…

SICP演習問題5.36, 5.37

5.36 operandsを評価するのは (define (compile-application exp target linkage) (let ((proc-code (compile (operator exp) 'proc 'next)) (operand-codes (map (lambda (operand) (compile operand 'val 'next)) (operands exp)))) (preserving '(env con…

コンパイラ

5.5ではコンパイラを作成する. なんとか動くものはできたけど、全然理解できていない. 最後の節は訳がひどい!が,原著もなかなかわかりにくい... 翻訳のほうは,なんであんなに点の使い方が下手なんだろう.せめて点をうまく使えば,直訳だとしても,意味…

ついに5.5に入る

5.29, 5.30があるけれど、パスして5.5に入る。 ついに最後です!

SICP演習問題5.26, 5.27, 5.28

3問続いているけれど,やることは同じなのでまとめてしまう. 5.26 (define (factorial n) (define (iter product counter) (if (> counter n) product (iter (* product counter) (+ counter 1)))) (iter 1 1)) を実行するときのスタックを監視せよという問…

積極制御評価器と演習問題5.23, 5.24

積極制御評価器...漢文みたいな名前. 5.23と5.24が組み込んであります. reg-machine-with-meter.scmはレジスタ計算機のスタック監視機能がついているもの. evaluator.scmは4.1の超循環評価器のapply,evalを削除したもの. (load "~/hoge/foo/reg-machine-…

SICP演習問題5.22

今回の問題は (define (append lis1 lis2) (if (null? lis1) lis2 (cons (car lis1) (append (cdr lis1) lis2)))) (define (append! x y) (set-cdr! (last-pair x) y) x) という,2種類のappendをレジスタ計算機で実装すること. append (define append-mach…

SICP演習問題5.21

いままではif文の判定(2つしか分岐がないもの)をやっていたので,少し苦戦した. a 今回の問題は (define (count-leaves tree) (cond [(null? tree) 0] [(not (pair? tree)) 1] [else (+ (count-leaves (car tree)) (count-leaves (cdr tree)))])) をレジス…

SICP演習問題5.19(修正版)

さっき書いたエントリでは,脱出するところが不自然だったことに気付き修正した. 今回の問題はcall/ccを使えば簡単にできる.使っていいのかな?まぁいっか. 問題5.17をベースに今回の問題を解く.5.17はlabelをinstructionに付随させるものなので,その性…

SICP演習問題5.19

今回の問題はcall/ccを使えば簡単にできる.使っていいのかな?まぁいっか. 問題5.17をベースに今回の問題を解く.5.17はlabelをinstructionに付随させるものなので,その性質を使う.というか,むしろ,この問題のための問題だったのか? 今回追加するものと…

SICP演習問題5.18

夏休みだけに、ちょっと子供日記風に今日の天気を書いてみる。 今日は久しぶりに太陽さんに会いました。太陽さんが出てきたのでとってもとっても暑いです。ぼくは冬の太陽さんは大好きだけど、夏の太陽さんはきらいです。 僕の本心です。 早く夏よ去れ〜とい…

SICP演習問題5.16

現時点でのmake-new-machine. 今回追加するのは,exercise5.16のもの. (define (make-new-machine) (let ((pc (make-register 'pc)) (flag (make-register 'flag)) (stack (make-stack)) (the-instruction-sequence '()) (instruction-count 0) ;; exercise…

SICP演習問題5.15

命令の回数を数える問題. 変更点 make-new-machineに変数instruct-countを追加 (define (instruct-count-up) (inc! instruct-count))をmake-new-machineに追加 make-new-machineのexecuteに(instruct-count-up)を追加 (define (print-instruct-count) (prin…

SICP演習問題5.14

(define (fact-print-stack n) (define fact-machine (make-machine '(n val continue) (list (list '= =) (list '- -) (list '* *)) '(fact (assign continue (label fact-done)) fact-loop (test (op =) (reg n) (const 1)) (branch (label base-case)) (s…

SICP演習問題5.17

やや苦戦したので、ちょっとだけ参照した. 参照元 http://www29.atwiki.jp/sicpstudygroup/pages/90.html instにlabelをくっつけるのいいのは参照でわかったけれど、データ構造はどうしようかと悩んだ. 今回変更するのは, make-new-machineに変数labelを…

SICP演習問題5.13

とりゃっとちょっと言ってみた. 今回の問題は簡単?だった. 変更点 make-machine make-assign make-save make-primitive-procedure 方針としては make-machine変数の数を減らす {make-assign, make-save, make-primitive}を実行するときにそのレジスタが作…

SICP演習問題5.12

もっとスマートにやりたいものです... assembleが実行されるときに一緒に作られるようにした. なので,それぞれの命令に追加した. (define (make-machine register-names operations controller-text) (let ((machine (make-new-machine))) (for-each (lamb…

SICP演習問題5.11

SICPと関係ないけれど,早く夏が終わらないかなぁ..... a (define fib-machine (make-machine '(continue val n) (list (list '< <) (list '= =) (list '- -) (list '+ +) (list 'print print)) '(controller (assign continue (label fib-done)) fib-loop (…

SICP演習問題5.9

;; exercise 5.9 (define (make-operation-exp exp machine labels operations) (let ((operation (lookup-primitive (operation-exp-op exp) operations)) (aprocs (map (lambda (e) (if (not (label-exp? e)) (make-primitive-exp e machine labels) (erro…

SICP演習問題5.7,5.8

計算機モデルが動いたので,問題5.7をやる. 5.7 ;; exercise 5.7 (section5.1) ;; a (define expt-machine (make-machine '(b n val continue) (list (list '= =) (list '- -) (list '* *)) '((assign continue (label expt-done)) expt-loop (test (op =) …

SICP5章2節計算機モデル

問題5.8を入れた計算機モデル ;; register machine simulator (define (make-machine register-names ops controller-text) (let ((machine (make-new-machine))) (for-each (lambda (register-name) ((machine 'allocate-register) register-name)) registe…