第130回 素人くさいSICP読書会(at 三田某所)

  • 会場提供ありがとうございました
  • 杉本さんが新しいMacBookを披露。かっくんが異様にうらやましがってた
  • 問題4.50
  • amb-choicesでシャッフルするよ派とanalyze-ambのcarとcdrを書き換えるよ派に分かれる
  • シャッフルについてruiさんが書いてるのを杉本さんが発見→ここ
  • 自分は後者
  • こんな感じ↓のをかませばOKのはず
(use srfi-1)
(use srfi-27)

(let ((n (random-integer (length choices))))
  (let ((rcar (list-ref choices n))
        (rcdr (append (take choices n) (cdr (drop choices n)))))
  • Alyssaの問題を救うかどうか確かめるにはそもそも問題4.49をやってなきゃなんない
  • ということで戻る
  • 問題4.49
  • みんなはamb-list(リストを引数として取れるamb)がどうのという話をしてたんだけど、自分が「別にambじゃなくてランダムに返せばよくね」と言ったら割と賛同してもらえた
  • というか家に帰った後で考えたんだけど、「常に成功し」と問題文に書いてある時点で、ambは使えないよね。ambだとすべて選択しおわったら失敗しちゃうので
  • いつも違うものを返すようにまじめに実装してもいいんだけど、Alyssaがつまんないことを示すだけなら、↓みたいな手抜き実装で十分な気がしてきた
(define (parse-word word-list)
  (let ((tag (car word-list)))
    (cond ((equal? tag 'noun)
           '(noun student))
          ((equal? tag 'verb)
           '(verb studies))
          ((equal? tag 'article)
           '(article the))
          ((equal? tag 'prep)
           '(prep for)))))
  • eq?じゃなくて遅いequal?を使ってるのは、この処理系ではたしか標準でequal?しかスルーさせてなかったためで、他意はない

【追記】
処理系を見たら、スルーさせてるのはeq?の方だった…