第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がないと思いこんでた

【追記】

  • GaucheのマニュアルみたらreceiveはSRFI-8とのこと
  • R5RSの範囲内でvaluesの多値を受け取るにはcall-with-valuesという関数を使うらしい