即使字符串存在于列表中,`member` 也返回 `NIL`

Axe*_*son 2 lisp common-lisp

通用 Lisp。

我正在尝试确定给定列表中是否存在字符串。

我的目标是拥有, (member searched-string my-list) 但我不断得到NIL

为什么(member "foo" '("foo" "bar"))返回NIL

在此处输入图片说明

cor*_*ump 8

:test关键字参数的默认值为#'eql

如果既没有提供 a:test也没有提供:test-not参数,就好像提供了一个:test参数#'eql

17.2.1 测试函数规则——满足二元测试

字符串既不是数字也不是字符,因此两个字符串eql只有在它们eq(相同)时才是,但在您的示例中,您可能分配了两个不同的字符串。您可以在string=字符串由编译器驻留的地方进行优化,使它们eq,但这将是一个实现细节。

在下面,相同的foo字符串用于构建列表,并作为 的参数member,调用实际上找到了值:

(let ((foo "foo"))
  (member foo (list foo "bar")))
=> ("foo" "bar")
Run Code Online (Sandbox Code Playgroud)

但更普遍的是,您希望传递一个字符串比较函数,例如string-equal(case-insensitive) 或string=(exact case),或者只是一个通用的相等谓词;下面的两个示例都找到了 sarch 字符串:

(member "foo" '("foo" "bar") :test #'equal)
(member "FOO" '("foo" "bar") :test #'equalp)
Run Code Online (Sandbox Code Playgroud)