2012-07-16 67 views
1

我已经实现了这个功能。它应该检查我们提供给它的输入,如果它在列表中找到,屏幕上将显示“True”。但是,它只适用于数字,如果我给它一个字符,我收到一个错误。如何检查项目是否是Common Lisp中列表的成员?

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

我该如何修改它,以便它也可以查找给它的任何字符? 在此先感谢。

回答

1

简单,使用#情商,而不是#'=,因此3号线就变成了:(if (eq item x) ...

或者,你可以使用内置的#'intersection检查,如果任何给定的项目是在列表中,这样的:(if (not (eq (intersection lst '(x)) nil)))

+1

'eql'通常是更好的相等谓词比'eq'(尝试,例如,'(列表(=(/ 1 2)(/ 2 4))(当量(/ 1 2)(/ 2 4) )(eql(/ 1 2)(/ 2 4)))'看看结果是否让你感到意外)。 – Vatine 2012-07-19 10:06:15

+0

这是非常有趣的,谢谢(是的,它让我感到惊讶:) – 2012-07-19 10:50:10

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

+0

它现在完美,只需用“=”符号替换“eq”。 非常感谢您的善意帮助。 – Momed 2012-07-17 05:42:59

+1

我认为你的意思是相反的,用“eq。”代替“=”。确保你了解'eq','eql','equal','equalp'和kin之间的区别。 – seh 2012-07-17 12:24:47

1

有几个比较操作。一般的是eq,eql,equalequalp。在hyperspec中查看它们。

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

最后,列表操作,有喜欢member功能,可以通过手写循环中解脱出来。他们采用可选test参数,通过该参数您可以传递比较功能。

+0

非常感谢。它工作完美。但只有一个问题“eq”功能与“equalp”功能之间有什么区别? – Momed 2012-07-17 05:41:44

+0

@Momed:http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node74.html那里你去 – 2012-07-17 15:57:21

相关问题