1

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

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

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

4

3 回答 3

1

有几个比较运算符。一般的有eq, eql,equalequalp。在 hyperspec 中查找它们。

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

最后,对于列表操作,还有类似的函数member,可以让你从手工编写循环中解放出来。它们带有一个可选test参数,您可以通过该参数传递比较函数。

于 2012-07-16T20:26:34.287 回答
1

很简单,使用#'eq 代替#'=,因此第3 行变为:(if (eq item x) ...

或者,您可以使用内置的#'intersection检查列表中是否有任何给定项目,因此:(if (not (eq (intersection lst '(x)) nil)))

于 2012-07-16T20:22:05.600 回答
1

正如您所发现的,=函数仅适用于数字。

如果您尝试基于您的函数find,您可能会发现它默认使用eql函数作为其测试提供了您寻求的行为:

(defun element (needle haystack)
  (not (null (find needle haystack))))

作为 的替代品find,您还应该研究它的兄弟姐妹memberposition. 在您的情况下,由于您只想区分是否已找到该项目,因此您应该选择工作最少的功能。我的猜测是这里的loss和positionthat是等价的;返回它从中提取 的列表,而返回. 在这两个函数中,都需要提取.memberfindmembercarfindcarcar

于 2012-07-16T20:23:15.333 回答