如何检查项目是否是Common Lisp中列表的成员?

时间:2012-07-16 19:37:21

标签: lisp common-lisp

我已经实现了这个功能。它应该检查我们给它的输入,如果在列表中找到它,屏幕上会显示“True”。但是,它只适用于数字,如果我给它一个字符,我会收到一个错误。

(defun element (x lst)
  (dolist (item lst) 
    (if (= item x) (return t))))

如何修改它以便它还可以查找给它的任何字符? 提前谢谢。

3 个答案:

答案 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的替代,您还应该研究其兄弟姐妹memberposition。在您的情况下,由于您只想区分已找到的项目,您应该选择功能最少的功能。我的猜测是position在这里丢失,memberfind是等价的; member会返回从中提取car的列表,而find会返回car。在这两个函数中,有必要提取car

答案 2 :(得分:1)

有几个比较运算符。一般的是eqeqlequalequalp。在超标准中查找它们。

对于特定类型的对象,通常有专门的比较器,例如: string=char=

最后,对于列表操作,有一些函数,如member,可以让你免于手动编写循环。它们采用可选的test参数,您可以通过该参数传递比较函数。