SICP 3.3.4 デジタル回路のシミュレーション
テキストはここ。
FPGAでお金もらっている人間としては、飛ばしちゃだめだろうと思って打ち込むも、実行させるとエラーがでる。
時刻の表現周りでおかしいようだ。時間とって追おう。入力の0と1を、Schemeの論理値(#t、#f)に置き換えて、シミュレーションするのかと思ったら、結構本格的で驚く。
inverterの実装から(コメントは僕が追加)
(define (inverter input output) ; 入力1つ、出力1つでinverterを定義
(define (invert-input)
(let ((new-value (logical-not (get-signal input)))) ; get-signalで入力ポートの読み出し、読み出した値にシミュレータ上のnotを取る
(after-delay inverter-delay
(lambda ()
(set-signal! output new-value))))) ; 遅延を追加して、反転された新しい値を出力ポートへの書き込む
(add-action! input invert-input) ; 入力が変化するたびに、上の処理を実行するよ
'ok)
(define (logical-not s) ; 実際の演算部分の定義
(cond ((= s 0) 1) ; schemeのnotを使っていないから、XやZの機能も足せるよ。
((= s 1) 0)
(else (error "Invalid signal" s))))
モンテカルロの問題も同じだけど、勉強用の例題と割り切らないで学習者自身での拡張がちゃんと視野に入っているのが凄い。教科書のサンプル用に作ったんじゃなくて、実績のある物からエッセンスを抜き出してきたような感じ。
The comments to this entry are closed.


Comments