リスト内を検索する

Common Lispにはエレメントがリストに含まれているかを検索する関数が複数存在します。今回はそれぞれの違いについて自分なりに解説していきます。

  1. find
    find 関数は第一引数が第二引数のリストに含まれている場合、第一引数を返します。第一引数が第二引数のリストに存在しない場合は nil を返します。 デフォルトでは比較に eql を使用しているため、文字列や cons セルを比較する場合は、:testパラメータに equal を指定します。 find 関数の問題点としては、リストに nil が含まれているかを検索すると、含まれていても nil が返ってきてしまうことです。 上記の問題については、次に紹介するmember関数を使用することで解決します。
  2. member
    member 関数は第一引数が第二引数のリストに含まれている場合、それ以降の内容をリストにして返します。第一引数が第二引数のリストに存在しない場合は find と同じように nil を返します。
  3. position
    position 関数は第一引数が第二引数のリストに含まれている場合、そのインデックスを返します。第一引数が第二引数のリストに存在しない場合は find と同じように nil を返します。 nilを検索した際にも、存在する場合はインデックスを返すので、member のように nil がリストに含まれているかを検索できます。

参考
CLHS: Function FIND, FIND-IF, FIND-IF-NOT
CLHS: Function POSITION, POSITION-IF, POSITION-IF-NOT
CLHS: Function MEMBER, MEMBER-IF, MEMBER-IF-NOT
Check if item is in a list (Lisp) - Stack Overflow