« スーパーコンピューターを20万円で創る | Main | ESL D&V 6章 »

2007.06.30

SICPでデジタル回路

ディジタル回路(SICP 3.3.4 A simulator for Digital Circuits)動いたよ!とgoogle向けにキーワードを書いてみた。


わかってしまうとたいした理由じゃない。

(define (set-current-time! agenda time)
  (set-car! agenda time))

のset-car!がset-cdr!になっていた。the-agendaのcar部が時刻を表し、今実行した時刻で上書きするところが、イベントーキューをまるごと破壊していた。


デバッグ用にlist構造を書いた図をupしておきます。この図は遅延が2のinverterを一つ用意したときの図です。
(inverter input output)
宣言した時点で、inputの初期値0に対して、2nsに反転させる手続きinverter-inputが実行されます。

デバッグに手こずったのがこの関数


(define (first-agenda-item agenda)
(if (empty-agenda? agenda)
(error "Agenda is empty -- FIRST-AGENDA-ITEM")
(let ((first-seg (first-segment agenda)))
(set-current-time! agenda (segment-time first-seg))
(front-queue (segment-queue first-seg)))))

見た目はfirst-agenda-itemと普通の関数なのに、中でset-current-time!を呼び出して破壊的操作をしている。なんてこったい。これに気がつかず遠回りをしてしまった。

|

« スーパーコンピューターを20万円で創る | Main | ESL D&V 6章 »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/15603282

Listed below are links to weblogs that reference SICPでデジタル回路 :

« スーパーコンピューターを20万円で創る | Main | ESL D&V 6章 »