Проверить, есть ли элемент в списке (Lisp)

#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)) -> ноль