Проверьте, есть ли элемент в списке (Лисп) - PullRequest
31 голосов
/ 27 мая 2011

Какой простой способ проверить, есть ли элемент в списке?

Что-то вроде

(in item list)

может вернуть true, если item=1 и list=(5 9 1 2) и false, если item=7

Ответы [ 3 ]

42 голосов
/ 27 мая 2011

Обычный Лисп

FIND не очень хорошая идея:

> (find nil '(nil nil))
NIL

Выше будет означать, что NIL нет в списке (NIL NIL) - что неправильно.

Цель FIND не в том, чтобы проверять членство, а в том, чтобы найти элемент, который удовлетворяет тесту (в приведенном выше примере тестовая функция обычно используется по умолчанию EQL). FIND возвращает такой элемент.

Использование MEMBER:

> (member nil '(nil nil))
(NIL NIL)  ; everything non-NIL is true

или POSITION:

> (numberp (position nil '()))
NIL
20 голосов
/ 27 мая 2011

Используйте MEMBER, чтобы проверить, есть ли элемент в списке:

(member 1 '(5 9 1 2))  ; (1 2)

В отличие от FIND, он также может проверить, есть ли NIL в списке.

7 голосов
/ 27 мая 2011

Вы можете использовать find:

(find 1 '(5 9 1 2)) ; 1
(find 7 '(5 9 1 2)) ; nil

Рассмотрите возможность использования аргумента :test:

(find "a" '("a" "b") :test #'equal)
...