SICP
とりあえず今までの分をリファクタリング。 int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "usage: %s file\n", argv[0]); return -1; } string input = load(argv[1]); if (input == "") { return -1; } Tokenizer tokenizer(input)…
lamdaが動いた!。(前回アドバイスを下さった arinoさん、shiroさんありがとうございました) ((lambda (a) "test") 3) =>EVAL: "test" 構文解析をして「(」の直後にある要素は Applicationの本体、それ以外は Applicationの引数とします。 その時点では当然…
最近、字句解析とか構文解析をしていましたが、その試行錯誤のサマリです。 前提 SICPの4章ではSchemeのインタプリタをSchemeで実装します。 勉強のためにC++で実装してみます。 基本はScheme->C++に置き換えています。(そんなに簡単じゃないけど) 置き換…
持ち時間のもう1時間は字句解析の勉強にあてる。 Schemeの入力に対してどのような token を定義すればよいか分からないんだけど想像で以下のようにしてみる。 token enum { IDENTIFIER, STRING, NUMBER, LEFT_PAREN, RIIGHT_PAREN, QUOTE, }; 字句解析 まず…
begin beginは、Schemeよりも簡単に書いた。 actionを vectorで保持して、eval時には evalSequenceするだけ。 手続き 「手続き作用はいずれでもない任意の合成式である」と書いてあっていいたい事は分かるのだけれど、C++でどう書いてよいか分からない。 き…
さらっと流して書いていますが、実は設計にはとても時間がかかってる。 なにぶん初めてなので行ったり戻ったりがあるので。 self->evaluating? number, stringのとき true if (exp->type() == Object::NUMBER || exp->type() == Object::STRING) { return tr…
eval-if if を評価します。 ここは言語の奥を見るようで楽しいのですが true / false の定義って何?ということを立ち止まって考えることができます。 metacircular であれば、両方の真偽値をあわせるのが良いでしょう。 今回は以下のように実装しました。 bo…
4章では Scheme の上に Schemeインタプリタを作る過程でいろいろなものを学んでいきます。 このように、被実装言語と実装言語が同じなことを metacircular というらしいのですが、読んでいるだけでドキドキしてきます。 実際4章を読み進めていくと、とても面…
apply 実装の肝は apply と env のあたりだということに気づく。 (define (apply procedure arguments) (cond ((primitive-procedure? procedure) (apply-primitive-procedure procedure arguments)) ((compound-procedure? procedure) (eval-sequence (proc…
4章は着実に読んでおりますが、あれこれ試行錯誤しているので日記が書けていません。 今しばらくお待ちください。(誰に言っているんだろう。)
言い訳 3章の最後の練習問題をやる気が起きずこのままだと読書が止まりそうなので、4章に突入します。 問題3.58-3.82あたりをスキップしました。 超言語的抽象 さあ metacircular の始まりですよ。 evalとかapplyの話が出てきた。 evaluatorもinterpreterも…
問題3.56, 57 略 問題3.58 これは何だろうか。直感的に最初は、帯分数を約分するのかとか思ったけど全然違った。 (expand 1 7 10) (1 (expand 3 7 10)) (1 (4 (expand 2 7 10))) (1 (4 (2 (expand 6 7 10)))) まだイメージがわかない。 割り算なんだけど 10 …
問題3.52の続き 昨日悩んでいた点は、結局 force をメモするかどうかで結果が違うことを考慮してなかったのが問題でした。 ヒントを下さった g:sicp:id:hyukiさんありがとうございました。Gaucheのforceはメモするので、メモしたくない場合は (define-macro …
問題3.51 streamの問題。 前回から間が開いてしまったのはハマったから。 SICPには stream の実装が完全には書いてなくて、自力で実装を試みたがだめで、Gaucheの util.stream を使ったがよく分からず。。 結局Googleキャッシュ - 読書会II第一三回を発見し…
4章を先読みとかしているくせに、全然3章が進んでいないので反省中。 今日は問題3.50が解けるまで寝ない!と決めたらわりとすぐに解けた。 問題3.50 cons-streamや、stream-carをまだ定義していなくて、テストができないので cons/carで実装してみた。 (defi…
問題3.47 テストしてないけどこのような感じで良いと思う。test-and-set!もほぼ同じなので省略。 (define (make-semaphore n) (let ((counter n) (mutex (make-mutex))) (define (acquire) (mutex 'acquire) (if (= counter 0) (begin (mutex 'release) (acq…
問題3.41 Benの心配は杞憂である。 直列化しない場合、例えば withdraw の中で balance が set! される前後の間に、balanceを取得できるようになってしまうが読み取りだけなので問題ない。 問題3.42 安全であると思う。 ツッコミ募集。 問題3.43 直列変換器…
3.4並列性:時が本質的 読む前の想像では atomicな処理とか semaphore とか、dead lock などの話であると予想。 このあたりはMonaで必要に迫られて結構勉強したから得意なはず。 問題3.38 Perter, Paul, Maryの共同口座だそうです。 Puff the Magic Dragonを…
3.3.5 制約の拡散 制約の拡散のポイントは以下の通り。 登場人物は2人 コネクタと制約(constraint) コネクタは1つ以上の制約をリストとして持っている(1つ以上の制約と接続されている)制約は自分が接続しているコネクタの値が変更したときに呼ばれる手続きを…
OSS WEB|SICP|ex-3.23うれしい!
ぼやき SICPを見ながら、コードを打ち込んだのですが一箇所「 ( 」の対応をミスっていて3日間くらい全然進みませんでした。 でもそのおかげで、コードを舐めるように眺めたので構造が理解できました。 本をさらっと読んで動かしただけではここまでの理解は得…
id:higepon:20060518:1147942020を改造して、Gaucheではじめての実用(?)スクリプトを書いてみました。 ↓こんな感じで使います。 gosh replace.scm sample.txt "^(hogehoge.+)$" "#\\1"#!/usr/bin/env gosh (use file.util) (define (main args) (define (rep…
待ちに待っていたデジタル回路のシミュレーション。 オラ、何だかワクワクしてきたぞ! 問題3.24-27 略。 問題3.28 and とほぼ同じ。 今の段階では add-action の実装が見えないので or-action-procedure が2回呼ばれておかしくなるんじゃないかと心配。 と…
実用っぽいコードを書かないと中々上達しないと思うので無理やり書いてみました。 引数で受け取ったファイルを開いて、ファイル内を置換する。 「sedとかPerlならすぐに書けるよ」とか「もっと汎用化したスクリプトを書いたほうが良い」というのは分かるので…
問題3.23 問題3.21の構造のままでfront-insert/rear-insert/front-deleteは O(1)を達成できるが、rear-deleteは無理。 なぜかというと rear-ptr を現在のrear-ptrの一つ手前の要素にしなければいけないから。 データの構造を変えなければいけないというのが…
Gaucheのリファレンスを眺めていて面白かったのでメモ。 cutとlet1はマクロみたいです。 ;; macro cut (define (make-plus) (lambda (a b) (+ a b))) (display ((make-plus) 4 5)) (define (make-plus) (cut + <> <>)) (display ((make-plus) 4 5)) ;; macro…
#scheme-jp(wide系 IRCチャンネル)でのネタふりで、ファイルの読み込みを学んでみました。 Schemeは port を介して入出力するようです。 面白いのが read の戻り値がS式だということです。(これはひらっちさんから教えてもらいました。) なのでファイルの中…
問題3.22 え?手続きで出来るの?と思って一瞬でも疑った自分を恥じます。 Scheme楽しいよ。楽しすぎるよ。 (define (make-queue) (let ((front-ptr '()) (rear-ptr '())) ;; public interface (define (empty-queue?) (null? front-ptr)) (define (front-que…
Ruiさんよりコメントを頂きました。 Schemeに慣れた人が書くとこんなにもきれいなのか。ありがとうございます。 このようにコードを見せていただくことはとても勉強になります。 sum は (apply + list) と書けますね。Gaucheだとport-for-eachという便利な高…
問題3.18 最初の要素を保持しておく。 要素をたどっていって終端までたどり着いたら循環は存在しない。 最初の要素と eq? なものが見つかれば循環が存在する。 ところで下のコードの front ですが、constant(readonly)にするにはどうしたらよいんでしょうか…