Shammer's Philosophy

My private adversaria

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 と完全に同じようにはならない。どういうときにどちらを使うか、という話をできるレベルではないが、完全に同じではないということを忘れずに、目的に合う形で処理を書いていく必要がありそうだ。まあ、同じじゃないってことは覚えておこう。