我已经实现了这个功能。它应该检查我们提供给它的输入,如果它在列表中找到,屏幕上将显示“True”。但是,它只适用于数字,如果我给它一个字符,我收到一个错误。如何检查项目是否是Common Lisp中列表的成员?
(defun element (x lst)
(dolist (item lst)
(if (= item x) (return t))))
我该如何修改它,以便它也可以查找给它的任何字符? 在此先感谢。
我已经实现了这个功能。它应该检查我们提供给它的输入,如果它在列表中找到,屏幕上将显示“True”。但是,它只适用于数字,如果我给它一个字符,我收到一个错误。如何检查项目是否是Common Lisp中列表的成员?
(defun element (x lst)
(dolist (item lst)
(if (= item x) (return t))))
我该如何修改它,以便它也可以查找给它的任何字符? 在此先感谢。
简单,使用#情商,而不是#'=,因此3号线就变成了:(if (eq item x) ...
或者,你可以使用内置的#'intersection检查,如果任何给定的项目是在列表中,这样的:(if (not (eq (intersection lst '(x)) nil)))
当你发现,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
。
有几个比较操作。一般的是eq
,eql
,equal
和equalp
。在hyperspec中查看它们。
对于特定类型的对象,常常出现专门比较器,例如string=
和char=
。
最后,列表操作,有喜欢member
功能,可以通过手写循环中解脱出来。他们采用可选test
参数,通过该参数您可以传递比较功能。
非常感谢。它工作完美。但只有一个问题“eq”功能与“equalp”功能之间有什么区别? – Momed 2012-07-17 05:41:44
@Momed:http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node74.html那里你去 – 2012-07-17 15:57:21
'eql'通常是更好的相等谓词比'eq'(尝试,例如,'(列表(=(/ 1 2)(/ 2 4))(当量(/ 1 2)(/ 2 4) )(eql(/ 1 2)(/ 2 4)))'看看结果是否让你感到意外)。 – Vatine 2012-07-19 10:06:15
这是非常有趣的,谢谢(是的,它让我感到惊讶:) – 2012-07-19 10:50:10