第164回 素人くさいSICP読書会(at 三田某所)
- 会場提供ありがとうございました
- 参加者3人と最少人数
- 最悪でもこの面子で最後までたどりつければいいかな
- 継続登場。ただし注の中
- ここで継続渡しを使っているのは多値を返すためらしい。多値はvaluesとreceive(SICPの中で定義しているreceive関数ではなくGaucheが用意する特殊形式)でも返せる
- タイムインターメディア製のGaucheセットだとreceiveがキーワードになっているので、関数とは違うインデントになってしまう
- instsの構造がなかなか理解できなかった
- assocの引数の順番について。key-valueの順番。逆の方が自然?とか
- 問題5.8
- assocの実装による。assocが前から走査する実装になっていれば3が返る。少なくともSICPのassocの実装ではそうなる
- extract-labelsの書き換え。labelが使われてたらエラーを返す条件を追加するだけ
(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 "Error : this label is already used!" next-inst) (receive insts (cons (make-label-entry next-inst insts) labels))) (receive (cons (make-instruction next-inst) insts) labels)))))))
- なぜかGaucheにはerrorがないと思いこんでた
【追記】