(wat-aro)

生きてます

2015-01-01から1年間の記事一覧

SICP 問題 3.49

ある口座の内容によって次にアクセスする口座の内容がかわるような状況. 具体的な状況は思い浮かばず.

SICP 問題 3.48

;; make-accountの引数にidを追加. ;; dispatchの引数に'numberで口座番号を参照できる. (define (make-account-and-serializer balance id) (define (withdraw amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insu…

SICP 問題 3.47

#| このような形でmake-semaphoreは使われる. |# (define (make-serializer) (let ((semaphore (make-semaphore 6))) (lambda (p) (define (serialized-p . args) (semaphore 'acquire) (let ((val (apply p args))) (semaphore 'release) val)) serialized…

SICP 問題 3.46

cellがfalseの時に複数のプロセスが同時にcellにアクセスすればmutexは破られる

SICP 問題 3.45

serializerが入れ子になるために無限ループする

SICP 問題 3.44

(define (transfer from-account to-account amount) ((from-account 'withdraw) amount) ((to-account 'deposit) amount)) 交換と違い,残高の差を計算する必要がないので問題はおきない

SICP 問題 3.43

deposit,withdrawが直列化されてない場合, 書き換えられる前の値を参照したまま変更後の値をsetしてしまうために残高の合計が保存されない場合が有る.

SICP 問題 3.42

安全な変更.並列性の間に違いはない.

SICP 問題 3.41

変更箇所は書き換えによる変更を行わないのでそのままでも害はないので賛成しない.

SICP 問題 3.40

10^2,10^3,10^4,10^5,10^6が取り得る値となる. 直列かするとこのうち,10^6のみが残る.

SICP 問題 3.39

101:P1がxに100をセットしてから,P2がxに101をセットする 121:P2がxに11をセットしてから,P1がxに121をセットする 100:P1がxから10をとってきて,そこでP2がxに11をセット,P1が続きの(* 10 10)を計算してxに100をセットする

SICP 3.4.2 parallel-executeの実装

これ以降やるための準備です. gauche.threadsの使い方がわからなかったのでリファレンス見ながらググって見つけたコードを理解しました. (use gauche.threads) (define (delay time proc) (lambda () (thread-sleep! time) (proc))) (define (delay-print …

SICP 問題 3.38

(define balance 100) ;; Peter (set! balance (+ balance 10)) ;; Paul (set! balance (- balance 20)) ;; Mary (set! balance (- balance (/ balance 2))) ;;a 3つのプロセスがある順序で逐次的に実行された場合のbalanceの取り得る値 ;;35,40,45,50 ;;b …

SICP 問題 3.37

(define (c+ x y) (let ((z (make-connector))) (adder x y z) z)) (define (c- x y) (let ((z (make-connector))) (adder x z y) z)) (define (c* x y) (let ((z (make-connector))) (multiplier x y z) z)) (define (c/ x y) (let ((z (make-connector))) …

SICP 問題 3.36

(define a (make-connector)) (define b (make-connector)) (set-value! a 10 'user) set-value!を評価している間で (foreach-except setter inform-about-value constraints) が評価される環境を示す環境図を書け.

SICP 問題 3.35

平方器を新しい基本制約として定義する. (define (squarer a b) (define (process-new-value) (if (has-value? b) (if (< (get-value b) 0) (error "square less than 0 -- SQUARER" (get-balue b)) (set-value! a (sqrt b) me)) (set-value! b (square a) …

SICP 問題 3.34

平方器をmultiplierを使って実装する時の問題点 (define (make-connector) (let ((value false) (informant false) (constraints '())) (define (set-my-value newval setter) (cond ((not (has-value? me)) (set! value newval) (set! informant setter) (f…

SICP 問題 3.33

入力として三つのコネクタa,b,cをとり,cの値がaとbの値の平均であるような制約を達成する手続きaverager. adderとmultiplierを繋ぐコネクタをp. 定数2に繋がるコネクタをxとした. (define (averager a b c) (let ((x (make-connector)) (p (make-connector…

schemeでクイックソートとマージソート

こういうのを書いてなかったので. ;; クイックソート (define (quick-sort lst) (if (null? lst) lst (let ((first (car lst))) (append (quick-sort (filter (lambda (x) (< x first)) (cdr lst))) (list first) (quick-sort (filter (lambda (x) (>= x fi…

Gaucheの組み込み手続きの戻し方

何回も忘れてその都度ググったりプログライングGauche見るのでダメですね. ここに書いておきます. (define func-name (with-module gauche func-name))

SICP 問題 3.32

;; A->B->Cという順に並んだ回線があったとする. ;; FIFOの場合Aが変化するとそれがBに伝わり,次のactionが実行されCに伝わる. ;; FILOの場合Aが変化してもまずB-C間のactionが実行されCは変化しない. ;; そのあとA-B間のactionが実行されるAの変化がBに…

SICP 問題 3.31

;; accept-action-procedure!でprocを実行して初期化している部分で初期化しないとどうなるか. (define (make-wire) (let ((signal-value 0) (action-procedures '())) (define (set-my-signal! new-value) (if (not (= signal-value new-value)) (begin (s…

SICP 問題 3.30

;; 最後のfull-adderのc-inは0. ;; (make-wire)の初期値は0と仮定してます. (define (ripple-carry-adder Ak Bk Sk C) (let ((c-in (make-wire))) (cond ((null? (cdr Ak)) (full-adder (car Ak) (car Bk) 0 (car Sk) C) 'ok) (else (full-adder (car Ak) …

SICP 問題 3.29

(define (or-gate a1 a2 output) (let ((b1 (make-wire)) (b2 (make-wire)) (c (make-wire))) (inverter a1 b1) (inverter a2 b2) (and-gate b1 b2 c) (inverter c output))) ;; 遅延時間は(+ and-gate-delay (* 2 inverter-delay))

SICP 問題 3.28

(define (or-gate a1 a2 output) (define (or-action-procedure) (let ((new-value (logical-or (get-signal a1) (get-signal a2)))) (after-delay or-gate-delay (lambda () (set-signal! output new-value))))) (add-action! a1 or-action-procedure) (add…

SICP 問題 3.26

(define (make-table) ;; tree (define (make-tree key value left-branch right-branch) (list key value left-branch right-branch)) ;; 選択子 (define (key-tree tree) (car tree)) (define (value-tree tree) (cadr tree)) (define (left-branch tree) …

SICP 問題 3.25

;; keyではなくkey-listを'(x y z)という形で渡す ;; key-listのcdrがnullになるまで再帰すればkeyの数がいくつでも対応できる (define (make-table) (let ((local-table (list '*local-table*))) (define (lookup key-list) (let loop ((key-list key-list)…

SICP 問題 3.24

assocをequal?以外を使ってテストできるようにする. make-table手続きはキーの等価性に使うsame-key?手続きを引数にとる. (define (make-table same-key?) (define (assoc key value records) (cond ((null? records) #f) ((same-key? key (caar records))…

SICP 問題 3.23

対を使って前後へのポインタを持ったdequeを実装する. ;; dequeの実装 (define (value-ptr ptr) (caar ptr)) (define (prev-ptr ptr) (cdar ptr)) (define (next-ptr ptr) (cdr ptr)) ;; ((value))というリストを作る (define (make-ptr value) (list (list…

SICP 問題 3.22

局所状態を持つ手続きとしてキューを定義する. (define (insert-queue! queue item) ((queue 'insert-queue!) item)) (define (delete-queue! queue) ((queue 'delete-queue!))) (define (make-queue) (let ((front-ptr '()) (rear-ptr '())) (define (empt…