Значение по умолчанию для параметра ключевого слова :test
- #'eql
:
Если не указан ни аргумент :test
, ни :test-not
, это как если бы :test
был предоставлен аргумент #'eql
.
17.2.1 Правила о тестовых функциях - выполнение теста с двумя аргументами
Строки не являются числами и символами, поэтому две строки равны eql
, только если они eq
(идентичны), но в вашем примере у вас, вероятно, есть две разные строки. У вас может быть оптимизация, при которой string=
строки интернируются компилятором, делая их eq
, но это будет деталь реализации.
Здесь ниже та же строка foo
используется для построения списка , и в качестве аргумента для member
, и вызов фактически находит значение:
(let ((foo "foo"))
(member foo (list foo "bar")))
=> ("foo" "bar")
Но в более общем плане вы хотите передать функцию сравнения строк, например string-equal
(без учета регистра) или string=
(точный регистр) или просто универсальный предикат равенства; в обоих примерах ниже находится строка sarch:
(member "foo" '("foo" "bar") :test #'equal)
(member "FOO" '("foo" "bar") :test #'equalp)