find と remove-if-not
remove-if と remove-if-not を理解する - Shammerismでちょっとだけ言及したが、、、remove-if-not を使って、リストから欲しい情報を取り出すことができる。しかし、-not という関数は Lisp の世界では duplicated とされており、いつ使用できなくなってもおかしくないもののようだ。remove-if-not を使用しているところは、別の関数に置き換えないといけなくなるかもしれない。
その置き換え候補に当然 find が含まれる。そもそも、これがあるのになぜ remove-if-not を使う必要があったのだろうか。。。前の記事を書いたときもそうだが、なぜそのまま find を使おうとしなかったのか、自分でもよくわからないのだが。。。とりあえず、違いを見るために適当にやってみた。
? (remove-if-not #'(lambda (x) (equal x 10)) '(10 20 30)) (10) ? (find 10 '(10 20 30)) 10 ? (find '(10) '(10 20 30)) NIL ? (find '(10) '(10 20 30) :key #'car) > Error: The value 10 is not of the expected type LIST. > While executing: CAR, in process Listener(4). > Type cmd-. to abort, cmd-\ for a list of available restarts. > Type :? for other options. 1 >
どちらも、list から 10 というものを取り出す処理。remove-if-not は cons で取り出している。それに対して、find は括弧のない状態で取り出している。ちょろっと思いついた数パターンを試してみたが、remove-if-not と完全に同じようにはならない。どういうときにどちらを使うか、という話をできるレベルではないが、完全に同じではないということを忘れずに、目的に合う形で処理を書いていく必要がありそうだ。まあ、同じじゃないってことは覚えておこう。