関数型言語の勉強にSICPを読もう - (46) 3章 - 標準部品化力、オブジェクトおよび状態 (186-191ページ)

問題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)
            (acquire))
          (begin
            (- counter 1)
            (mutex 'release))))
    (define (release)
      (mutex 'acquire)
      (+ counter 1)
      (mutex 'release))
    (define (dispatch m)
      (cond ((eq? m 'acquire)
             (acquire))
            ((eq? m 'release)
             (release))))
    dispatch))

問題3.48

口座番号 1と100
PeterとPaulはどちらも口座番号1のserializerを獲得しようとするから、互い違いにならない。
コードは略で。

問題3.49

現実的な例が思い浮かばない・・・。

並列性、時および通信

ロックとかの話になると、必ずプロセス通信とかまで話が及ぶのだけれどもなんで?という疑問に対する答えが書いてある。

3.5ストリーム

時を離散ステップで計るなら、時間関数を(無限かも知れぬ)並びとしてモデル化できる。本節ではモデル化しようとするシステムの時間史を表現する並びを使い、変化をモデル化する方法をみよう。
そのためにストリーム(stream)という新しいデータ構造を取り入れる

この周辺の説明に鳥肌が立った。やっぱりSICPはもっと早く読むべきだった。
ここから始まるストリームの説明と遅延評価の話は面白すぎる。


delayとforceの実装とか素敵。force素敵だだだ。


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404