我已经实现了这个功能。它应该检查我们给它的输入,如果在列表中找到它,屏幕上会显示“True”。但是,它只适用于数字,如果我给它一个字符,我会收到一个错误。
(defun element (x lst)
(dolist (item lst)
(if (= item x) (return t))))
如何修改它以便它还可以查找给它的任何字符? 提前谢谢。
答案 0 :(得分:1)
简单,使用#'eq代替#'=,因此第3行变为:(if (eq item x) ...
或者,您可以使用内置#'intersection来检查列表中是否有任何给定项目,因此:(if (not (eq (intersection lst '(x)) nil)))
答案 1 :(得分:1)
正如您所发现的那样,the =
function仅适用于数字。
如果您尝试在find
上使用您的功能,您可能会发现默认使用the eql
function作为其测试提供您所寻求的行为:
(defun element (needle haystack)
(not (null (find needle haystack))))
作为find
的替代,您还应该研究其兄弟姐妹member
和position
。在您的情况下,由于您只想区分已找到的项目,您应该选择功能最少的功能。我的猜测是position
在这里丢失,member
和find
是等价的; member
会返回从中提取car
的列表,而find
会返回car
。在这两个函数中,有必要提取car
。
答案 2 :(得分:1)
有几个比较运算符。一般的是eq
,eql
,equal
和equalp
。在超标准中查找它们。
对于特定类型的对象,通常有专门的比较器,例如: string=
和char=
。
最后,对于列表操作,有一些函数,如member
,可以让你免于手动编写循环。它们采用可选的test
参数,您可以通过该参数传递比较函数。