理系学生日記

おまえはいつまで学生気分なのか

SICP

問題3-21 (3.3.2 Representing Queues)

キューを表現する!!という小節. 単純にリストをキューにしちゃえばいいんだけど,それだと効率が悪いアホか!みたく書いてあって,なんでかというと要素を挿入するために,の時間がかかるからだそうです.これはキューの最後の要素へのポインタがなかなか見…

問題3-20 (3.3.1 Mutable List Structure)

cons, car, cdr, set-car!, set-cdr! を local state と assignment で実現した以下の関数セット. (define (cons x y) (define (set-x! v) (set! x v)) (define (set-y! v) (set! y v)) (define (dispatch m) (cond ((eq? m 'car) x) ((eq? m 'cdr) y) ((eq…

問題3-19 (3.3.1 Mutable List Structure)

問題3-18の問題を,空間計算量が定数に収まるようにして解く. 考えとしては,リストの各要素をつなぐポインタが,それよりも出現順序の早い要素を指していないかを逐一判定する感じにしてる. 時間計算量は増えちゃうけど,その辺はトレードオフかなって思…

問題3-18 (3.3.1 Mutable List Structure)

与えられたリストの中に,サイクルがあるかどうかを返す述語を作る. アイディアとしては,今まで見たポインタを全て記憶していって,記憶した全てと cdr を逐一比較していくという単純な方法. (define (has-cycle? l) (define (not-include? elem l) (not …

問題3-17 (3.3.1 Mutable List Structure)

問題3-16で出てきた count-pairs を,同じ pair を重複して数えないようにするよう変更する問題. (not (not-include ...))に深い意味はない. (use srfi-1) (define (count-pairs x) (define (not-include? elem l) (not (find (lambda (x) (eq? x elem)) l…

問題3-16 (3.3.1 Mutable List Structure)

pair の数が 3 個なのにも関わらず,count-pair の返り値が 3,4,7,制御を返さないという 4 パターンの引数を考えろという話. (define (count-pairs x) (if (not (pair? x)) 0 (+ (count-pairs (car x)) (count-pairs (cdr x)) 1))) 最初勘違いしててとま…

問題3-15 (3.3.1 Mutable List Structure)

同じ出力を持つ z1 と z2. (define x (list 'a 'b)) (define z1 (cons x x)) ; ((a b) a b) (define z2 (cons (list 'a 'b) (list 'a 'b))) ; ((a b) a b) この両者に対して,set-to-wow! を適用する. (define (set-to-wow! x) (set-car! (car x) 'wow) x)…

問題3-14 (3.3.1 Mutable List Structure)

mystery によって何が起こるでしょう! (define (mystery x) (define (loop x y) (if (null? x) y (let ((temp (cdr x))) (set-cdr! x y) (loop temp x)))) (loop x '())) (define v (list 'a 'b 'c 'd)) (define w (mystery v)) (print w) ; (d c b a) 見事…

問題3-13 (3.3.1 Mutable List Structure)

どうなるかって無限ループだよ >< 泣ける!!!! (define (last-pair x) (if (null? (cdr x)) x (last-pair (cdr x)))) (define (make-cycle x) (set-cdr! (last-pair x) x) x) (define z (make-cycle (list 'a 'b 'c))) (last-pair z) last-pair でずっとリ…

問題3-12 (3.3.1 Mutable List Structure)

set-car! と set-cdr! でリスト構造を変更することができるよ!!というおはなし.append と append! が以下のように定義されているとき, (define (append x y) (if (null? x) y (cons (car x) (append (cdr x) y)))) (define (append! x y) (set-cdr! (last-…

問題3-10 (3.2.3 Frames as the Repository of Local State)

(define (make-withdraw initial-amount) (let ((balance initial-amount)) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds")))) ここに (let ( ( ) ) )が( (lambda () ) )のシンタック…

問題3.9 (3.2.2 Applying Simple Procedures)

代入を導入することによって置き換えモデルが適用できなくなったので,いわゆる環境モデルを導入しましたというお話. 環境モデルの元では,関数(原文ではprocedure)定義はlambdaのシンタックスシュガー. (define (square x) (* x x)) は実際には環境で (de…

問題3.8 (3.1.3 The Costs of Introducing Assignment)

わりかし楽しい遊びで,下の式について,`+'の引数が左から右に評価されるのであれば0を,右から左に評価されるのであれば1を返すように,関数fを定義しろという問題です. (+ (f 0) (f 1)) もちろん,fがreferentially transparentなら無理なんですけど,破…

問題3.7 (3.1.3 The Costs of Introducing Assignment)

代入がでてきたんだけど,代入を導入することによって,今までシンボル名は単に値に対する名前だったのが,変数という概念を導入しなきゃいけないことになりました.変数=値を格納する場所です.今まで,シンボル名は値のエイリアスだったのに! >

問題3.6 (3.1.2 The Benefits of Introducing Assignment)

乱数を返すrandについて,乱数系列が指定した値から始められるとクールじゃね?きっとクールだから作れ,という問題です. ところが,gaucheの乱数は基本的にメルセンヌ・ツイスターぽくて,乱数系列の最初の値とかが指定できない.そこでまずは疑似乱数を作…

問題3.5 (3.1.2 The Benefits of Introducing Assignment)

モンテカルロ法で定積分して面積求めるとかやります.汎用なモンテカルロ法はすでに用意されてて,こんなのです. trialsが試行回数で,experimentは実行する関数(predicate)だ!で,このmonte-carloはexperimentがどれだけの割合でtrueを返したかの割合を返…

問題3.4 (3.1.1 Local State Variables)

7回連続でパスワードを間違ったら警察を呼びます! 間違いの回数を数えるためのvalidation-failureとその閾値を保持するvalidation-limitをつくっとく. (define (call-the-cops) (error "call the cops")) (define (make-account balance password) (let ((s…

問題3.3 (3.1.1 Local State Variables)

パスワードつきの銀行口座作るよ! この銀行口座は,振込と引き出しができるんですけど,パスワードがあってないとそういうのができないスゴい口座だ! (define (make-account balance password) (let ((stored-password password)) (define (withdraw amount)…

問題3.2 (3.1.1 Local State Variables)

make-monitoredの仕様: 1引数の関数fを引数として取る 返り値はfが何回呼び出されたかを保持する関数mf mfは"how-many-calls?"を引数として渡された場合,fが呼び出された回数を返す mfは"reset-count"を引数として渡された場合,fが呼び出された回数を0に…

問題3.1 (3.1.1 Local State Variables)

修論に本気だす前に2章の最後あたりやってたんですけど,今見ると相当複雑なかんじになってたので,先に進むことにしたのでした.魅惑の3章に突入. 状態変数を持つ個々のオブジェクトが集まってシステムを構成するという見方は,とてもスゴいフレームワーク…

問題2-82を解く準備をする

自力で解くことにする。がんばる!! 自分で解くのに、なんとなくfor-eachを使ってみたかったんだけど、 Function: for-each proc list1 list2 … [R5RS] 手続きprocをリストの各エレメントに対して順に適用します。 procの結果は捨てられます。for-eachの戻り…

問題2-82 (2.5.2 Combining Data of Different Types)

答えみましたごめんなさい。

問題2-81c (2.5.2 Combining Data of Different Types)

2つの引数に同じタグがついていて(同じ型の引数で)、その2つに対する演算がテーブルに定義されなかったときはcoercionをしないようにしろという課題。 単純にタグを比べればいいだけっぽい。 (define (apply-generic op . args) (let ((type-tags (map typ…

問題2-81b (2.5.2 Combining Data of Different Types)

問題の意味がイマイチ取れない。 結局apply-genericに何かすべきことがあるのか、あるいはそのままで動くのかって話のように読めるけど、そのままで動くと思われ。ていうか、ある型からその型へcoercionしたって無限ループに陥るだけじゃないのかな。

問題2-81a (2.5.2 Combining Data of Different Types)

どういう内容だったか忘れてしまうので、エントリにメモのこしていく事にしたのでした。 今まで無視ってきたこととして、複素数と普通の数の足し算とか、そういう混ぜ合わさった計算ができない感じです。 もちろん、引数として明示的に複素数と自然数を取る…

問題2-80 (2.5.1 Generic Arithmetic Operations)

次はゼロかどうか判定する関数作るよー。rectangularパッケージ。 (x,y)が両方とも0のときzeroですね。 (define (zero? z) (and (= (real-part z) 0) (= (imag-part z) 0))) (put 'zero? '(rectangular) (lambda (z) (zero? z))) polarパッケージは絶対値が0…

問題2-79 (2.5.1 Generic Arithmetic Operations)

汎用性のあるequ?を作ります。 equ?は与えられた2つの数(有理数だったり複素数だったり)が一緒かどうか調べる関数だ!! rectanglarパッケージにこれ1つずつ追加。 (define (equ? z1 z2) (and (= (real-part z1) (real-part z2)) (= (imag-part z1) (imag-pa…

問題2-78 (2.5.1 Generic Arithmetic Operations)

ようやくちょっと分かってきた。ていうか、この2.5に入って、問題の意図を汲み取るのもムズかった。 (define (attach-tag type-tag contents) (if (eq? type-tag 'scheme-number) contents (cons type-tag contents))) (define (type-tag datum) (cond ((pai…

問題2-77 (2.5.1 Generic Arithmetic Operations)

(magnitude z)から、(apply-generic 'magnitude z)が呼ばれる。 apply-genericはzのcomplexタグによって、complexパッケージを選ぶ(ここでcomplexタグが外される)。 apply-genericがもう一回呼ばれ、zのrectanglarタグによって、rectanglarパッケージを選…

問題2-76 (2.4.3 Data-Directed Programming and Additivity)

generic operations with explicit dispatch 新しい型のデータを加えるときは,選択子がデータ型の詳細を他の関数から隠しているなら、その選択子のみの書き換え(新しい型から選択できるようにする)を行えばいい感じかと思います。 新しい操作を加えるとき…