2016-12-20 3 views
1

Я пытаюсь понять, как работает функция участника со списком и списком списков.
Вот пример.Функция члена с многоуровневым списком в Common Lisp

(member '(A 6) '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'second) 

Я хочу, чтобы проверить с помощью функции-члена, если второй аргумент списка «(A 6) является членом второго списка на входе. Ответ должен быть

true 

но я делаю что-то неправильно, потому что Common Lisp ответ:

Error: Cannot coerce (A 6) to type STRING. 

Так как я могу взять второй аргумент из первого списка? Благодарим вас за помощь.

ответ

5

Что вам не хватает в том, что :key аргумент не применяется к первому аргументу member.

Другое дело, что second возвратит номер, а не символ.

Таким образом:

(member 'A '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'first) 
==> ((A 7) (B 6) (E 6) (D 5)) 
(member 'C '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'first) 
==> NIL 
(member 'E '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'first) 
==> ((E 6) (D 5)) 

Обратите внимание, что возвращаемое значение является хвост, не согласованный элемент списка. Это позволит использовать member как предикат, то есть, чтобы различать не находя nil и найти ничего:

(member nil '(1 2 nil 3)) 
==> (NIL 3) 
(find nil '(1 2 nil 3)) 
==> NIL 
(find t '(1 2 nil 3)) 
==> NIL 
Смежные вопросы