如何使用带有参数的谓词的find-if

时间:2014-12-14 10:38:49

标签: lisp common-lisp

我是一名自学习Common Lisp的初学者。假设我们有一个清单 ((1 20)(2 30)(5 40))。 给定值2,我们希望我们的函数在列表中搜索并返回 (2 30)。或者,如果给定值5,则应返回(5 40)。你明白了。 通常我们可以使用像

这样的谓词
(defun isIndexp (n point)
  (eq n (car point)))

为find函数返回T或NIL。但问题是如何将参数传递给谓词isIndexp?我尝试将参数n传递给isIndexp的谓词函数find,但代码抛出了一些错误,因为isIndexp应该有2个参数。我不知道如何告诉find isIndexp的第二个参数将成为points的元素。

(defun isIndexPresent (n points)
  (find (isIndexp n) points))

mapcar可能用于将列表转换为另一个(1 2 5)列表,然后找到元素2的位置,然后使用该位置提取(2 30)来自我们的原始列表。但我想知道是否可以使用find-if函数完成它。

1 个答案:

答案 0 :(得分:2)

您可以使用lambda表达式来创建所需的谓词:

(defun isIndexPresent (n points)
  (find-if (lambda (x) (isIndexp n x))
           points))

您还可以将find:key选项一起使用:

(defun isIndexPresent (n points)
  (find n points :key #'car))

或者,由于您的points列表是关联列表,因此您可以使用:

(defun isIndexPresent (n points)
  (assoc n points))