通用 Lisp。
我正在尝试确定给定列表中是否存在字符串。
我的目标是拥有,
(member searched-string my-list)
但我不断得到NIL。
为什么(member "foo" '("foo" "bar"))返回NIL?
:test关键字参数的默认值为#'eql:
如果既没有提供 a
:test也没有提供:test-not参数,就好像提供了一个:test参数#'eql。
字符串既不是数字也不是字符,因此两个字符串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)