#list #lisp #common-lisp
#Список #lisp #common-lisp
Вопрос:
Какой простой способ проверить, есть ли элемент в списке?
Что-то вроде
(in item list)
может вернуться, true
если item=1
и list=(5 9 1 2)
и false
если item=7
Ответ №1:
Common Lisp
FIND
не очень хорошая идея:
> (find nil '(nil nil))
NIL
Выше означало бы, что его NIL
нет в списке (NIL NIL)
, что неверно.
Цель FIND
не в том, чтобы проверить членство, а в том, чтобы найти элемент, который удовлетворяет тесту (в приведенном выше примере функция test используется по умолчанию 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
в списке.
Комментарии:
1. Мне не очень нравится этот совет в его нынешнем виде. элемент возвращает список с позиции, в которой найден элемент. В вопросе запрашивается что-то вроде предиката, возвращающего либо
T
, либоNIL
. Следовательно, я предлагаю, чтобы этот ответ был заключен вif
и все, что определено как функция, которую ищет любой, кто читает эту страницу:(defun contains (item sequence) (if (member item sequence) T NIL))
Ответ №3:
Вы можете использовать find
:
(find 1 '(5 9 1 2)) ; 1
(find 7 '(5 9 1 2)) ; nil
Рассмотрите возможность использования :test
аргумента:
(find "a" '("a" "b") :test #'equal)
Комментарии:
1. (найти nil ‘(nil nil)) -> ноль