2016-02-01から1ヶ月間の記事一覧
FLEXBOX FROGGYをクリアしたのでやりながらまとめたものを貼ります. Flexboxはここでやった部分しかしりませんが,これだけでも便利ですね. コンテナ全体 justify-content 水平方向への寄せなど flex-start: 左寄せ flex-end: 右寄せ center: 中央寄せ spa…
昨日別ブログにも書きましたが,向こうはやめてこっちに書いていきます. コードを書いてごはんが食べられるように頑張ります.
プログラミングの基礎 (Computer Science Library)作者: 浅井健一出版社/メーカー: サイエンス社発売日: 2007/03メディア: 単行本購入: 17人 クリック: 409回この商品を含むブログ (126件) を見る 演習問題をほぼ解いて一週間くらいかかりました. タイトル…
プログラミングの基礎で作ったメトロネットワーク最短路問題の解答. ダイクストラ法を使い求める. ここまでのメトロネットワーク最短路問題に関係する問題の解答すべてここに書いてある. (* サポートページからダウンロードしたglobal_ekimei_listとgloba…
わたろーです. 今プログラミングの基礎 (Computer Science Library)を読んでいます. これはOCamlとデザインレシピでプログラミングの基礎を学ぶという内容なのですが, 名前のない関数という節で気になる文章がありました. 14.4 名前のない関数 p145 名前…
読む前の状態と動機 読み始めた時点でプログラミング歴約1年 もうひとつのscheme入門でプログラミングに入門するも,高階関数で挫折. Ruby本二冊,Rails Tutorialを二周. 他読み始めたけど途中で飽きた本が何冊か. 仕事(非IT)が忙しく,プログラミング…
4.1節の超循環評価器を5.5で作った翻訳系でコンパイルする. 問題5.50 – SICP(計算機プログラムの構造と解釈)その302 : Serendip - Webデザイン・プログラミング http://himoiku.cocolog-nifty.com/blog/2008/07/sicp550_f385.html ここを参考にしました.…
compileとassembleを機械計算として持ち,REPLを行うレジスタ計算機を設計する. はじめ,assembleを命令列の上でやる方法がわからずに,compile-and-assembleという手続きを作り, それを機械演算として登録してRCEPLを実装したが, 問題5.49 – SICP(計算…
ECEVALのrepl上でコンパイル出来るようにする. これで動くかなって思ったら動いた. ただトレースした命令列を見ると, apply-dispatchからprimitive-procedureにジャンプせずに先頭に戻っている. なぜそうなるのかわからない. ;; 環境を拡張してprimitiv…
コンパイルした手続きから積極制御評価器で定義した手続きを使えるようにする. (define (compile-procedure-call target linkage) (let ((primitive-branch (make-label 'primitive-branch)) (compiled-branch (make-label 'compiled-branch)) (compound-br…
5.45と同様に今度はフィボナッチ数列の計算でそれぞれ比べる. gosh> (define fib ;;一回目以外は省略 (make-machine (list (list '< <) (list '- -) (list '+ +)) '(controller (assign continue (label fib-done)) fib-loop (test (op <) (reg n) (const 2…
コンパイルした階乗計算,積極制御評価器の階乗計算,特殊目的計算機のプッシュ数,最大スタック深さを調べて比較する. まずはコンパイルしたものから gosh> (compile-and-go '(define (factorial n) (if (= n 1) 1 (* (factorial (- n 1)) n)))) (total-pu…
基本手続きの名前を含む式の正しいコードを翻訳するため,翻訳時環境を調べるようにする. (cond ((self-evaluating? exp) (compile-self-evaluating exp target linkage)) ((variable? exp) (compile-variable exp target linkage ct-env)) ((quoted? exp) …
内部定義を吐き出してコンパイルする. まず4.16で作ったscan-out-definesがこれ. (define (scan-out-defines body) (define (split-defines proc-body defines non-defines) (cond ((null? proc-body) (cons (reverse defines) (reverse non-defines))) ((…
compile-variableとcompile-assignmentを文面アドレスを使った検索に対応 (define (compile-variable exp target linkage ct-env) (let ((address (find-variable exp ct-env))) (end-with-linkage linkage (if (eq? address 'not-found) (make-instruction-…
翻訳時環境に対する変数の文面アドレスを返す手続きfind-variableの実装 (define (find-variable var ct-env) (define (env-loop frame-address env) (define (scan variable-address frame) (cond ((null? frame) (env-loop (+ frame-address 1) (enclosing…
翻訳時環境を維持し,compile-lambda-bodyで拡張するように変更する. (define (compile-lambda-body exp proc-entry ct-env) ;; ct-envを追加 (let ((formals (lambda-parameters exp))) (append-instruction-sequences (make-instruction-sequence '(env p…
文面アドレスと実行時環境とり値を検索するlexical-address-lookupと 値を変更するlexical-address-set!を実装する. ;;; 文面アドレスを使って変数の値を探す (define (lexical-address-lookup lex-add r-env) (let ((frame (frame-values (list-ref r-env …
+と*について任意個の被演算子の式が使えるように拡張する. ここに書いた手続きを変更もしくは追加する. 3つ以上の引数の時はarg1に畳み込んで計算していく. (define (compile-open-code exp target linkage ct-env) (cond ((= (length exp) 3) (compile…
元のcompileによる出力と5.38abでcompile-open-codeを追加したコンパイラの出力を比べる. 命令列が約半分になっている. compile-open-codeを追加したコンパイラの出力 ((env) (val) ((assign val (op make-compiled-procedure) (label entry1) (reg env)) …
+ - * = はopen-codeとして (reg val (op +) (reg arg1) (reg arg2)) の形で処理できるようにする. (define (open-code? exp) (memq (car exp) '(= * - +))) (define (compile exp target linkage) (cond ((self-evaluating? exp) (compile-self-evaluating…
schemeの式をレジスタマシンのシミュレータの命令列に翻訳するコード. 理解するためにコメントを出来るだけつけた (load "./eval.scm") ;;; make-branchのための手続き (define label-counter 0) (define (new-label-number) (set! label-counter (+ 1 labe…
preservingを修正して常にsaveとrestoreをさせ,修正前と後を比較する. 修正前 (define (preserving regs seq1 seq2) (if (null? regs) (append-instruction-sequences seq1 seq2) (let ((first-reg (car regs))) ;first-regが (if (and (needs-register? s…
本文の被演算子の適用順はoperandをreverseしてから連結していくので右から左になっている. これを左から右に変更する. ;;; 最初のreverseをなくす (define (construct-arglist operand-codes) (if (null? operand-codes) (make-instruction-sequence '() …
本文の図5.18 の翻訳出力の例から翻訳前の式を導く. 答え (compile '(define (f x) (+ x (g (+ x 2)))) 'val 'next) 実行結果(整形済み) ((env) (val) ((assign val (op make-compiled-procedure) (label entry12) (reg env)) (goto (label after-lambda1…
反復的階乗手続きをコンパイルし,再帰版との本質的な違いを示せ. 反復的階乗手続きの内容を説明する. (compile '(define (factorial n) (define (iter product counter) (if (> counter n) product (iter (* counter product) (+ counter 1)))) (iter 1 1…
以下の2つの翻訳結果を比較してその相違を説明する. (compile '(define (factorial n) (if (= n 1) 1 (* (factorial (- n 1)) n))) 'val 'next) (compile '(define (factorial n) (if (= n 1) 1 (* n (factorial (- n 1))))) 'val 'next) 一つ目を出力して…
a: 演算子が記号である場合の組み合わせの式を別のクラスと認識し,そういう式を最適化する. operatorがvariableであればenvをsaveしない. ev-application (save continue) (assign unev (op operands) (reg exp)) (assign exp (op operator) (reg exp)) (…
どのタイミングで以下の式を評価する際にどのタイミング何を退避して復帰するか (f 'x 'y) 'x 'yはシンボルなのでこれ以上の評価が必要ないので 何も退避しなくてよい. ((f) 'x 'y) 'x 'yがシンボルなので上と同じく退避の必要ない. (f (g 'x) y) fを評価…
primitive-procedure のエラーもECEVAL上で扱えるようにする. まず基盤のschemeから手続きを登録するときに事前チェックするように変更する. もしエラーになるような引数が与えられた時には('failed . 'hoge-syntax-error)を返す. primitive-applyでvalに…