sicp
束縛を解放する手続きunbind!を作りなさいという問題。 解放する手続きは今いるスコープの中のモノだけで良いと思う。つまりfirst-frameで取得できる所から消すだけでよい。そうじゃないと、他の手続きとかが使おうとしてたりするのに、勝手に消してしまうこ…
手続きの一部を抽象化しろという話。 対象となる手続きは set-variable-value! define-variable! lookup-variable-value この三つの手続きの内側に既に明らかに似ている(hoge手続きが同じ名前(scan)で定義されてる。 こいつを抽象化すれば良いのかなと思う。…
フレームの構造を変える問題。 ということで、いじる部分は make-frame frame-variables frame-values add-binding-to-frame! 今は変数のリストと、値のリストが対になっているモノだ。 こいつを、名前と値の対にしたい。今 ((a b c d) 1 2 3 4) これからこ…
これもおおよそ一緒のタイプの問題。書き換えでできる。やることはちょっと変わる。 let->combinationに振り分け機能 named-let-clauses手続き named-let-bindings手続き(ここまでparameterってしてたよ。) named-let-body手続き expand-named-let-clauses手…
導出するだけで十分だと思う。なんかできてると思うし。基本的にこの一個前の問題とやり方は一緒。 evalに加える。 let*?手続き let*-clauses手続き let*-parametars手続き (var exp)からなるリストを取り出す let*-body手続き let*->nested-lets手続き expa…
今までも何度か出てきたが、letはlambdaで書き換え可能。 「導出された式」として、評価器に実装する。condの実装を参考にするとやることは、 evalに加える。 let?手続き let-clauses手続き let-parametars手続き (var exp)からなるリストを取り出す let-bod…
そもそもcondにこんな機能がついてたなんて知らないんだけど。 使い方は教科書のとおり。実際にやってみると、できるのでできるんだなぁと思う。condの修正は前のページでやっていた導出された式で使われてたcondのexpand-clausesを修正すれば良さそう。もと…
4章に入りました。 4章いきなり大変ですね。本当に大変です。 冒頭から12ページ分の写経を行わないと、プログラムが動きません。 216ページの頭から、228ページの半ばまで。 しかもただ写経しただけでは動かなくていくつか注意しないと行けないです。 ちなみ…
問題を読んでもさっぱりだ。 いったん問題3.6に戻ってよく見直す。自分が過去に作った答えなんてみつつ。 ここまでで、1時間くらいか。難しいな。 問題3.6だと resetというメッセージを送って帰ってきた手続きに整数値を与える 内部状態を使って持っている。…
いままで作ってきたいろいろの手続きを、smoothをつくって部品化するという話。 smoothを作ったら、あとは、問題3.74のスタイルで。 smooth手続きはかなり手こずって、テキトウにつくったら、 初項の答えが一個ずれた。ウーム。 という事で工夫して作ったの…
問題3.74で作ったmake-zero-crossingを変更し、 前の信号と今の信号の平均をとって平滑化し、比較するようにする。 その問題はLouis Reasonerが手を加えてくれているのだけれども、バグがあってそれを直す。ヒントは引数を増やせとある。 そういう問題。 Lou…
問題は二つ1. 教科書に定義があるsign-change-dector手続きをつくる。 2. 下記のの部分を埋める ;(define zero-crossings ; (stream-map sign-change-detector sense-data <expression>)) という問題。まず、1から sign-change-dectorは割と簡単。 注意しないといけない</expression>…
RC回路というと、回路とかもう忘れてしまったのでびっくりする。 だがよく問題を読む。回路の知識は特にいらない。やらなければ行けない事は二つ1. 教科書にある以下の式を表現する手続きRCを教科書の定義通り作る。 2. 1でつくったRCを利用して (define RC1…
制約を扱い易くしちゃおうという。 c+は既に問題に解答がのってる。 c*はc+のadderをmultiplierに変えればいい。 cvはc+の引数を減らして、adderをconstantに変えればいい 問題はc- とc+なんだけど、これはコネクタを引数としてとる部分の位置を変えるだけで…
squarerを基本制約として作ってみようという問題。 そんなに難しく考える必要はなくて、 p171のaddr、もしくは、p172のmultiplierを参考につくる。 まず考えるべきはだけど、これは根をセットする部分だ。 if式になっているからちょっとあせるが、よく見てa…
squarerを作ってみようという問題。 この欠点は、二乗を作るときにはちゃんと機能するんだけど、 反対向きにある数字の根を作ろうとすると失敗する。 なんでかって言うと、multiplierは2値設定されないと動かないようになっているからだ! 写経したやつを貼…
平均を制約を使って解く問題。(日本語正しいか不安。)数式にすると平均はこうなる。(a + b) / 2 = cだのでa + b = 2 * c と、ということで、P169の図3.28っぽい絵を妄想してみる。 ここまでくると余裕。 あとは、p169のcelsius-fahrenheit-converterを参考に…
ストレートにいけばいいすね。and-gateのパクリです。 andをorに変換しただけみたいな。 (define (or-gate a1 a2 output) (define (or-action-procedure) (let ((new-value (logical-or (get-signal a1) (get-signal a2)))) (after-deley or-gate-delay (lam…
アレだ、ド・モルガンの法則だ。 andとnotでどうやってorを表すか考えればいい。 (define (or-gate a1 a2 output) (let ((o1 (make-wire)) (o2 (make-wire)) (o3 (make-wire))) (inverter a1 o1) (inverter a2 o2) (and-gate o1 o2 o3) (inverter o3 output)…
全加算機を何個もつなげる感じの問題。 シンプルに考えればいいかなと思って以下。 (define (ripple-carry-adder A B S C) (if (null? S) 'ok (let ((c-out (make-wire))) (full-addr (car A) (car B) C (car S) c-out) (ripple-carry-adder (cdr A) (cdr B)…
思いつくのは簡単、実装にやたら時間がかかった。 dequeの仕組みをθ(1)で作るには、双方向リストがあればいいのかな? ってのはなんか解る。 なんでかっていうと、一番後ろにあるデータを取り除く時を考える。 一番後ろの一個前とかを、バカ正直に前から順番…
この問題はちょっと骨だった。 りあえず、ここまでの説明ページのアレやこれやを make-queueに入れ込んじゃう事で、解決しちゃった。 つまりこんな感じ (define (make-queue) (define (front-ptr queue) (car queue)) (define (rear-ptr queue) (cdr queue))…
Benに間違いを説明する問題。 手続きmake-queueでつくったqueueは値がそのまんま入っているんじゃなくて、 ( [queueの先頭へのポインタ] [queueの最後尾(nullの一個前)へのポインタ] ) みたいな感じだ。 だけども、デフォルトでのってる印字プログラムはポイ…
この問題、前回ナミックさんが問題3.18やってる時に「良い事おもいついた!eq?使えそうじゃね」 とか僕はなんか思いつくとすぐ調子に乗るので、チャチャをいれてたんだが、 問題3.18でそれをやっちゃうと、この問題3.19はやる事がなくなってしまうという そ…
type-tag contents attach-tag この三つの手続きを書き換える問題。 どう書き換えるかというと、 普通の数字(なんていうんだ?lispのリテラル?): 1とか2とか と システムで考えてきたscheme-number: (scheme-number 1) とか(scheme-number 2) を同等に扱え…
2ヶ月も間が空いている。。。 とりあえず、写経すりゃ動く。 p110-p113.scm #!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- ;;; 3.3.3 put & get (define (make-table) (let ((local-table (list '*table*))) (define (lookup key-1 key-2) (let ((subtabl…
make-from-mag-angをメッセージパッシングの流儀で実装する。 P102のAlyssaの複素数の手続きと P109のmake-from-real-imagを参考にすれば割とあっさりと解くことができます。 #!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (use ggc.debug.trace) (use ma…
いままでこの教科書で習ってきたのは、 ・明白な振り分けをもつ汎用演算 ・データ主導流 ・メッセージパッシング流 の三つ でこの問題は 1. 新しい型が絶えず追加されるシステムにはどの方法が適切か。 2. 新しい演算が絶えず追加されるシステムには、どれば…
この問題はほとんどコピペで解決できる。 思いつけば簡単だし、思いつかないと苦労しそうな問題。 a, b, c, dと四つ問題がある。a. たぶん記号微分の手続きのインターフェースを定義してるんじゃないかと思う。 データの形式が違っても基本これを使う、みた…
あんまり工夫なく問題をやってみました。 基本的にP106とかの(install-ほにゃらら-package) を参考にしながら書く。 ポイントとしては、自分なりにデータ形式を想定して作ると解きやすいと思う。 a はファイルに事業署名とかのタグをつけておけば良い。 b は…