Lisp 如何将find if与带参数的谓词一起使用

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

我是一个初学者,自己学习通用Lisp。假设我们有一份清单
((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我建议您阅读关于什么是编辑与评论的适当方式的元问题。