第2回 やさしいPAIP読書会(at 三田某所)

  • 会場提供ありがとうございました
  • 当初、机はない予定だったけど、机も用意してくれてた。ありがとうございます
  • 参加表明20人中、実際の参加は18名。ドタキャン率低いなあ。来月もこの調子でお願いします
  • 白状します。当日の午前まで全く準備してませんでした。ごめんなさい
  • 午後の空き時間に急いでスライド作ってsbclをインストールした。準竹迫メソッド
  • 反省点。あの説明じゃ再帰に慣れてない人は絶対に理解できないよね。1.2で例に挙げるnの数をもっと減らして実際に生成される展開式を示せばよかった
  • ゆるい発表をして突っ込まれるのはいつもの芸風なので、その点はまあよしと
  • テキストエディットからEmacsへのコピペは自分でもさすがにひどいと思う。「Emacs使いに殺されるぞ」と言われました。せめてEmacs内でウィンドウを分けてコピペ、とか
  • 【TODO】次回までにSLIME入れてまともな環境に近づける
  • 1.10音読 → 第1章全体の簡単なまとめ → 演習問題の解説という流れ

  • ドキュメンテーション文字列はただの注釈じゃなくてプログラムで操作できる、とか
  • 「fourth」を間違って「forth」と書いてた…
  • 演習1.1
  • 基本的には15ページのfirst-nameを書き換えてlast-nameを作るだけ
  • 注意点はlastが返すのはリストだという点くらい
  • 最後の要素を削るのは、(reverse (cdr (reverse …と書きたいのをぐっとこらえてbutlastを使用
  • Downey,の「,」をどう削るか。名前のところで「Downey |,| Jr.」とかにしておけば、削除候補に「|,|」を入れておくことで削れるとのこと。問題の趣旨としてはそんなことまで考えなくてよさそうだけど
  • 演習1.2
  • 階乗のプログラムを書くときに組み込みの階乗関数であるexptを使うのはあんまりなので、解答の(expt x 2)のところは、(* x x)として定義したsquareを使用
  • dotimesを使ったナイーブなループ版も用意。「ループ版」「再帰+最適化版」「組み込みのexpt」の性能を5の20万乗にかかる時間で比較してみた
    • ループ版 7.041秒
    • 再帰+最適化版 0.278秒
    • 組み込みのexpt 0.315秒
  • 再帰+最適化版の圧勝
  • 組み込みのexptのほうが遅いのは、整数乗だけじゃなくて実数乗とかもサポートしているためだと思われ
  • 演習1.3
  • 「何の処理か書いてない」って言ったら「ドキュメンテーション文字列にちゃんと書いてある」と言われた orz
  • 下の「nilも数える版」のオプショナル引数の使い方がおもしろい。再帰の際のフラグに使ってる
  • ただし、あまりよくない書き方。誤動作を引き起こす可能性のあるオプショナル引数を外部にさらすのは危険と佐野さんから指摘
    • 問題になるのは、expがnilの場合。オプショナル引数で数を渡すとその数がそのまま返り値になってしまう
    • さらに問題なのは、expがnilで、オプショナル引数でもnilを渡した場合。sbclで試したらエラーになった
  • 演習1.4
  • 基本的には問題1.3とほとんど変わらない
  • 演習1.5
  • 再帰版、ループ版、高階関数版の三つのバージョンが解答に示されてる
  • リストaとリストbの長さが違う場合、ループ版はエラーになる可能性があると参加者からの指摘。たしかにループ版ではリストaの長さしか見ていないので、リストbがリストaより短い場合はやばい

【次回発表者】

  • 第2章本文 yshigeruさん
  • 演習2.1 iori0121さん
  • 演習2.2 kurohukuさん
  • 演習2.3 snmstsさん
  • 演習2.4 私