SICP 読み (244) 5.2 レジスタ計算機での計算
昨晩、追記したはずと思っていたのですが下書きで満足してクタバッたものと思われます。なんと言えば良いのか分かりませんがオワってるなぁ (とほほほ
assemble に関するメモ
昨晩書いたはずと思われるメモを思いだしつつ控えておく事にする前に一連の手続きを以下に。
(define (assemble controller-text machine) (extract-labels controller-text (lambda (insts labels) (update-insts! insts labels machine) insts))) (define (extract-labels text receive) (if (null? text) (receive '() '()) (extract-labels (cdr text) (lambda (insts labels) (let ((next-inst (car text))) (if (symbol? next-inst) (receive insts (cons (make-label-entry next-inst insts) labels)) (receive (cons (make-instruction next-inst) insts) labels)))))))
assemble 内で呼び出している extract-labels に渡している lambda な手続きは extract-labels 定義の中で receive に束縛される。って思っていたんですが、そうではないの??
だいたい、この lambda な手続きは一体どこで実行されるのだろうか。ワケワカんなくなってきました。脳がはっきりしている内になんとか理解したいです。てーか、昨晩の理解は微妙だったので追記投入してなくてラッキーかも。(何
続
良く見りゃ呼んでるし。ってかこれは凄いぞ。言葉で説明できん (何
仕方が無いのでポイントを列挙
- 最初に渡されている lambda なソレの update-insts! は最後に実行
- receive は呼び出される時に作った lambda なソレになっている。という事は一番最初の update-insts! な lambda 式に渡す引数をひたすら作っている、と言える
- 多値を戻す云々はそーゆー意味だったんか。なんと言えば良いか分からんが凄いな
問題 5.8
lookup-label で assoc 使っています。例えば
gosh> (define l '((a 1) (b 2) (b 3))) l gosh> (assoc 'b l) (b 2) gosh>
みたいな感じで先頭から調べて見つけたら終了、が仕様だとすればレジスタ a に格納されるのは 3 になるはず。あるいは extract-labels 手続きは
(define (extract-labels text receive) (if (null? text) (receive '() '()) (extract-labels (cdr text) (lambda (insts labels) (let ((next-inst (car text))) (if (symbol? next-inst) (if (assoc next-inst labels) (error "Dup label entry -- ASSEMBLE" next-inst) (receive insts (cons (make-label-entry next-inst insts) labels))) (receive (cons (make-instruction next-inst) insts) labels)))))))
ってカンジで良いのでしょうか。以降でシミュレータの動作に必要な手続きが全部列挙されているので動作するようになり次第、確認予定ってコトで。