SICP

Exercise 4.9

while の展開を行う処理を考えてみる。 束縛変数のない名前付き let でループさせれば等価になるはずなので、 (define (while-predicate exp) (cadr exp)) (define (while-body exp) (cddr exp)) (define (while->let exp) (let->combination (make-named-le…

Exercise 4.6

let 式を等価の lambda 式に変形する問題。 (define (let->combination exp) (let ((body (let-body exp)) (bind (let-bind exp))) (cons (cons 'lambda (cons (let-parameters bind) body)) (let-arguments bind)))) (define (let-parameters exp) (map car…

Exercise 4.8

今度は名前付き let を lambda に展開する問題。一瞬どうするの?と戸惑ったけど、具体例を書いてみると (let foo ((a 1) (b 2)) (print "abc") (+ 1 a b)) を (lambda (a b) (define foo (lambda (a b) (print "abc") (+ 1 a b))) (foo 1 2)) に変換すると…

Exercise 4.5

(cond (test => recipient)) ↓ 普通の cond に変換する (cond (test (recipient test))) ↓ if に展開する。 (if test (recipient test)) と変形できるので、cond の処理は次のようになる。 (define (cond-arrow-caluse? clause) (eq? (cadr clause) '=>)) (d…

Exercise 4.7

今度は let* 式を等価の let 式に変形する問題 (define (make-let bind body) (cons 'let (cons bind body))) (define (let-parameters exp) (map car (car exp))) (define (let-arguments exp) (map cadr (car exp))) (define (let-bind exp) (cadr exp)) (…

Excercie 3.65

Excercie 3.65 Exercise 3.65.まずは pi-stream を参考にして ln2-stream を作成。 (define (ln2-summands n) (stream-cons (/ 1.0 n) (stream-map - (ln2-summands (+ n 1))))) (define ln2-stream (partial-sums (ln2-summands 1))) まんまです。 次にスト…

Excercie 3.63 - 3.64

Excercie 3.63 Exercise 3.63.問題に書かれているものだと stream-map に渡す (sqrt-stream x) を都度計算する必要があるが、 テキスト本文中に書かれている stream-map に guesses を渡す方法はローカル変数 guesses を参照し続けるだけでいいから、都度計…

Exercise 3.61. - 3.62

Excercie 3.61 Exercise 3.61.べき級数ストリームの逆数を表すストリームを求める問題。これは本に出てくる数式をそのまま scheme に直せばおk。 (define (invert-unit-series s) (stream-cons 1 (scale-streams (mul-series (stream-cdr s) (invert-unit-s…

Exercise 3.60.

Exercise 3.60.べき級数ストリームの乗算を行う mul-series を考える問題。 まずは 書いて考えてみる。 (a0+a1*x1+a2*x2+a3*x3+...)*(b0+b1*x1+b2*x2+b3*x3+...) = {a0+(a1*x1+a2*x2+a3*x3+...)}*{b0+(b1*x1+b2*x2+b3*x3+...)} ---(1)ここで、 A1 = a1*x1+a2…

Exercise 3.59

Exercise 3.59.sin, cos の無限級数展開の各項を要素として持つストリームを求める問題です。 a) まずは無限多項式 における係数のストリーム a0 a1 a2 ... を引数にとり、多項式を積分したときの係数を返す関数 integrate-series を考える問題です。ストリ…

Exercise 3.56. - 3.58.

Exercise 3.56 Exercise 3.56. (define S (cons-stream 1 (merge (merge (scale-stream S 2) (scale-stream S 3)) (scale-stream S 5)))) で良いはずなんだけど手元の gosh 0.8.11 では merge がうまく動いてくれなくて無限ループになった。 Exercise 3.57 E…

Exercise 3.53 - 3.55

3.5.2 節は無限ストリーム。素数のストリームが出てきましたが、project euler にもどるのは stream を読み終えてからにしよう。「無限ストリーム」って名前が格好いい。 Exercise 3.53. Exercise 3.53. (define s (cons-stream 1 (add-streams s s))) が何…

Exercise 3.52.

Exercise 3.52. (define sum 0) (define (accum x) (set! sum (+ x sum)) sum) (define seq (stream-map accum (stream-enumerate-interval 1 20))) (define y (stream-filter even? seq)) (define z (stream-filter (lambda (x) (= (remainder x 5) 0)) seq…

Exercise 3.51.

Exercise 3.51. (define (show x) (display-line x) x) (define x (stream-map show (stream-enumerate-interval 0 10))) (stream-ref x 5) (stream-ref x 7) が、どういう出力になるかという問題。 (cons-stream a b) だと a は即座に評価される。 というこ…

Exercise 3.50.

Exercise 3.50.map の stream 版である stream-map を作るという穴埋め問題。 (define (stream-map proc . argstreams) (if (stream-null? (car argstreams)) the-empty-stream (cons-stream (apply proc (map car argstreams)) (apply stream-map (cons pro…

3.5 Stream

project euler からちょっと離れて SICP でストリームの勉強をしてみます。 バックグラウンド gauche のドキュメントを見て stream が遅延評価を利用した無限長のリストを扱うものであるということは分かっているます。 遅延評価の事は少し前に Haskell に入…