Lisp 如何将find if与带参数的谓词一起使用
我是一个初学者,自己学习通用Lisp。假设我们有一份清单Lisp 如何将find if与带参数的谓词一起使用,lisp,common-lisp,Lisp,Common Lisp,我是一个初学者,自己学习通用Lisp。假设我们有一份清单 ((120)(230)(540))。 给定值2,我们希望函数在列表中搜索并返回 (230)。或者,如果给定值5,则应返回(5 40)。你明白了。 通常我们可以用一个谓词,比如 (defun isIndexp (n point) (eq n (car point))) 为find函数返回T或NIL。但问题是如何将参数传递给谓词isIndexp?我试图将一个参数n传递给find的谓词函数isIndexp,但该代码抛出了一些错误,因为is
((120)(230)(540))
。
给定值2
,我们希望函数在列表中搜索并返回
(230)
。或者,如果给定值5
,则应返回(5 40)
。你明白了。
通常我们可以用一个谓词,比如
(defun isIndexp (n point)
(eq n (car point)))
为find函数返回T或NIL。但问题是如何将参数传递给谓词isIndexp
?我试图将一个参数n
传递给find
的谓词函数isIndexp
,但该代码抛出了一些错误,因为isIndexp
应该有两个参数。我不知道如何告诉find
,的第二个参数是indexp
将是点的一个元素
(defun isIndexPresent (n points)
(find (isIndexp n) points))
mapcar
可能被用于将列表转换为另一个(1 2 5)
列表,然后找到元素2
的位置,然后使用该位置从原始列表中提取(2 30)
。但是我想知道是否可以简单地使用find if
函数来完成。您可以使用lambda表达式来创建所需的谓词:
(defun isIndexPresent (n points)
(find-if (lambda (x) (isIndexp n x))
points))
您还可以使用查找:键选项:
(defun isIndexPresent (n points)
(find n points :key #'car))
或者,由于您的积分列表是一个关联列表,您可以使用:
(defun isIndexPresent (n points)
(assoc n points))
为什么在:key
参数中使用find if
而不是find
?您的列表看起来像一个关联列表,为什么不使用assoc
?好的,谢谢您的快速响应。不知道如何使用find
和:key
参数详细说明。我们将了解它的工作原理并进行尝试。是,这是一个关联列表,是assoc
可能有效。让我也试试。在理解find
函数时,我似乎有一些误解。你建议的两种方法都有效。谢谢请查看标准命名约定。由于默认情况下读取器在内部对所有名称进行升格,所以在Common Lisp中camel case没有任何意义(实际上您将函数命名为ISINDEXPRESENT
)。标准是使用连字符,如index-present-p
。lambda表达式方法对我来说是非常新的。我还没研究过。但是看起来很有趣。其他两种方法都是直截了当的,我应该想到它们。谢谢@我还原了你的编辑。我知道正常的CL命名方式,但我的答案与问题中的名称保持一致。如果您想发表关于命名约定的评论,请随意,但这不是编辑的适当用途。@Barmar:我发现不更正样式是不合适的。@Svante我建议您阅读关于什么是编辑与评论的适当方式的元问题。