Проверьте, находится ли элемент в списке (Lisp)
Какой простой способ проверить, находится ли элемент в списке?
Что-то вроде
(in item list)
может возвращать true
, если item=1
и list=(5 9 1 2)
и false
, если item=7
Ответы
Ответ 1
Общий Lisp
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
Ответ 2
Используйте MEMBER
, чтобы проверить, находится ли элемент в списке:
(member 1 '(5 9 1 2)) ; (1 2)
В отличие от FIND
, он также может проверить, есть ли NIL
в списке.
Ответ 3
Вы можете использовать find
:
(find 1 '(5 9 1 2)) ; 1
(find 7 '(5 9 1 2)) ; nil
Рассмотрим использование аргумента :test
:
(find "a" '("a" "b") :test #'equal)