読者です 読者をやめる 読者になる 読者になる

SICPゼミ第46回

練習問題4.18

(define (solve f y0 dt)
  (define y (integral (delay dy) y0 dt))
  (define dy (stream-map f y))
  y)

(define (solve_ f y0 dt)
  (let ((y '*hoge*) (dy '*hoge*))
    (let ((a (integral (delay dy) y0 dt))
          (b (stream-map f y)))
      (set! y a)
      (set! dy b))
    y))

(define (solve__ f y0 dt)
  (let ((y '*hoge*) (dy '*hoge*))
    (set! y (integral (delay dy) y0 dt))
    (set! dy (stream-map f y))
    y))

実行結果

> (stream-ref (solve (lambda (y) y) 1 0.001) 1000)
2.716923932235896
> (stream-ref (solve_ (lambda (y) y) 1 0.001) 1000)
. . car: contract violation
  expected: pair?
  given: '*hoge*
> (stream-ref (solve__ (lambda (y) y) 1 0.001) 1000)
2.716923932235896

書き換えるとエラーが出る。 solve_のほうでは、(b (stream-map f y)) が評価されるときに y には '*hoge* が入っているのでエラーが出る。 solve__ のほうでは、(set! y (integral (delay dy) y0 dt)) が評価されるときに dy には '*hogeが入っているが、遅延評価なので問題なく動く。

by tube

練習問題4.19

Ben式は割といろんな言語である気がする.Eva式は逐次定義絶対殺すマンなので割と異常だと思う.ところがGoshはこの方針で実装されているのでたいへん気持ち悪い.とりあえず結論としては「ここで出てくるようなプログラムを書くのを止めろ」に尽きる.by現実