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