mokeheheのScheme日記

ツッコミ、添削大歓迎です。いろいろ教えてください。

2008-01-13

[] Practical Common Lisp第11章 コレクションの続き

http://gigamonkeys.com/book/collections.html

正月休み以来、ずいぶん開いちゃったな…。

ソートとマージ
  • sort や stable-sort は破壊的なのか
  • だけど、
(setf my-sequence (sort my-sequence #'string<))

と書かなきゃイカンとな。渡したシーケンスが破壊されるということであって、元のシーケンスがソートされるというわけではない、のかな?xyzzyでは大丈夫なようだけど。

部分シーケンス操作
  • subseq で部分シーケンスが取れる、ので部分文字列の取り出しもこれでできる
シーケンス述語
  • every, some, notany, notevery
  • Common Lisp だと not.every とか not.some とか関数の合成が短く記述できないから、いちいち用意しないといけないのが辛いね
  • 合成する関数を書くとこんな感じかね、funcall と apply が怪しいんだけども
(defun combine (fn1 fn2)
  (lambda (&rest rest)
    (funcall fn1 (apply fn2 rest))))
  • not.every
(funcall (combine #'not #'every) #'evenp #(1 2 3 4 5))  ;=> t 
  • not.some = notany
(funcall (combine #'not #'some) #'evenp #(1 2 3 4 5))  ;=> nil  '
  • 合成はできるけど、funcall を書かないといけないのがメンドイから、
(defun my-notevery (pred &rest rest)
  (apply (combine #'not #'every) pred rest))

とかして定義を楽にするしかないんだろうなぁ。

シーケンス写像関数
ハッシュテーブル
  • make-hash-table でハッシュを作れるけどキーの比較関数が eql なので、文字列をキーにする場合はうまくいかない、ので (make-hash-table :test 'equal) で作ればよい
  • このサンプルや他のものでも、ハッシュのキーとしてシンボル「'foo」を使ってるけど、キーワードシンボルなら何度評価してもキーワードのままだからキーワードシンボル「:foo」を使うべきではないのかね?この辺の使い分けがよくわからんなぁ
  • ハッシュにキーがないのか値がnilなのかを判定するために、gethash で多値を返して、それを multiple-value-bind で受け取ってあれこれするのってメンドウじゃないかなぁ?それより haskey? みたいなのが楽なのでは?
ハッシュテーブル走査
トラックバック - http://sicp.g.hatena.ne.jp/mokehehe/20080113