SICPゼミ第26回

練習問題3.50
(define (stream-map proc . argstreams)
  (if (null? (car argstreams ))
    the-empty-stream
    (stream-cons
      (apply proc (map stream-car argstreams))
      (apply stream-map
       (cons proc (map stream-cdr argstreams))))))

by dolicas

練習問題3.51
gosh> (define x
(stream-map show
(stream-enumerate-interval 0 10)))

0x
gosh> (stream-ref x 5)

1
2
3
4
55
gosh> (stream-ref x 7)

6
77
練習問題3.52
> (define sum 0)

>(define (accum x) (set! sum (+ x sum)) sum)
> sum
0

> (define seq
(stream-map accum
(stream-enumerate-interval 1 20)))
> sum
1

> (define y (stream-filter even? seq))
> sum
6

> (define z
(stream-filter (lambda (x) (= (remainder x 5) 0))
seq))
> sum
10

> (stream-ref y 7)
136
> sum
136

> (display-stream z)

10
15
45
55
105
120
190
210'done
> sum
210

メモ化していないと、毎回accumが呼ばれてsumに足されていってしまうのでへんなことになる。

by tube

SICPゼミ第25回

練習問題3.48

ループができないから。

serialized-exchange の実装例

;今までの serialized-exchange と同じやつ
(define (serialized-exchange account1 account2)
  (let (( serializer1 (account1 'serializer ))
        (serializer2 (account2 'serializer )))
    (( serializer1 (serializer2 exchange ))
     account1
     account2 )))


(define (serialized-exchange-renewal account1 account2)
  (let ((id1 (get-ID account1))
        (id2 (get-ID account2)))
    (if (> id1 id2)
        (serialized-exchange account2 accoun1)
        (serialized-exchange account1 account2))))

by tube

練習問題3.49

極論を言ってしまえば、使う可能性のあるリソースを全て列挙してID順にロックするというようにしてしまえば、(並列化もくそもないが) デッドロックは回避できる。
そうでなく、確実に必要なリソースのみをロックするようにすれば、条件分岐によってID順に逆らったロックの順番ができてしまい、デッドロックがおきうる。具体例は特に面白くもないので割愛。

SICPゼミ第24回

練習問題3.46

スレッド1が(car cell)した結果falseが返ってくる→スレッド1が(set-car! cell true)する前にスレッド2が(car cell)してfalseを得る→同時に2つのスレッドがmutexを獲得できたものとして実行されてしまう。

練習問題3.47

(a)

(define (make-semaphore n)
  (let ((counter 0) (m (make-mutex)))
    (define (the-semaphore ord)
      (cond
        ((eq? ord 'acquire)
          (begin (m 'acquire)
            (if (< counter n) (begin (set! counter (+ counter 1)) (m 'release))
              (begin (m' release) (the-semaphore 'acquire)))
            ))
        ((eq? ord) (begin (m' acquire) (set! counter (- counter 1)) (m' release))))
       the-semaphore))

by dolicas

(b)

(define (make-semaphore)
  (let ((cell (make-cell n)))
    (define (list-test-and-set! cell)
      (if (test-and-set! cell)
          (if (null? (cdr cell))
              (the-semaphore 'acquire )
              (list-test-and-set! (cdr cell)))
          #f))
    (define (the-semaphore m)
      (cond ((eq? m 'acquire)
             (list-test-and-set! cell))
            ((eq? m 'release) (clear-cell! cell ))))
    the-semaphore ))
  
(define (make-cell n)
  (if (= n 0)
      '()
      (cons #f (make-cell (- n 1)) )))

clear-cell! は無理。

by tube

SICPゼミ第23回

練習問題3.38

a.
35 Peter->Mary->Paul
40 Mary->Peter->Paul (後ろ二人順不同)
45 Peter->Paul->Mary (前二人順不同)
50 Paul->Mary->Peter

b.
60
f:id:sicp-zemi:20160829162710j:plain

by tube

練習問題3.39

100, 101, 121.

by tube

練習問題3.40

10^k (k = 2,3,4,5,6)

直列化すると10^6だけ

by dolicas

練習問題3.41

'balance はset!しないので変なことはおきない。

by dolicas

練習問題3.42

問題ない。

練習問題3.43

直列化されているので口座1と口座2の交換中に、これら2つの口座に他の処理が行われることはない。よってこの1回交換によって残高が交換される(さらに合計は保存する)ことが示されれば、帰納的に全体でもそのようになると分かる。1回の交換で大丈夫なのは自明。

serializeしなかったとき。
口座1と口座2、口座2と口座3をexchange
合計も破綻してる。
f:id:sicp-zemi:20160829173912j:plain

by dolicas

練習問題3.44

Louis は正しくない。
exchange のときは balance にアクセスして得た値を直列化せずに使用していたため問題が発生したが、transfer では、withdraw, deposit それぞれ自体は直列化されているため問題が発生しない。

by tube

練習問題3.45
((serializer1 (serializer2 exchange ))
	account1
	account2 )))

のところで、serializer1が使われる。
その後 (exchange acount1 acount2)が処理されるが、この中で ((account1 'withdraw) difference) が実行される。これは (balance-serializer withdraw) で、serializer1(balance-serializerと同じ)で直列化されているが、

((serializer1 (serializer2 exchange ))
	account1
	account2 )))

ですでにserializer1を使ってしまっているのでこの部分は実行されず待機される。この待機が解消されることはなく永遠に処理が終わらない。

by dolicas

SICPゼミ第22回

練習問題3.32

入力を 0,1 → 1,1 → 1,0 と変化させたとき振る舞いが変わる。
一回目の入力の変化で「出力を1にする」という予定が追加され、その後2回目の入力の変化で「出力を0にする」という予定が追加される。キューだとこの順番に処理されるので出力は最終的に0だが、リスト(要するにスタック)を使うと逆に処理されるので最終出力が1になりおかしい。

by dolicas

続きを読む