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

标签 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)))

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

(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))

您还可以使用 find:key 选项:

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

或者,由于您的列表是一个关联列表,您可以使用:

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

关于lisp - 如何将 find-if 与带参数的谓词一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27468468/

相关文章:

LISP 打印函数文档字符串

multidimensional-array - Common Lisp 中的非矩形数组? (用于教学目的的一般问题。)

lisp - 当应用于 Common Lisp 中的函数参数时,函数第 n 次访问哪个对象?

arrays - Scheme 语言中的 3D 数组

arrays - Lisp 为什么我的对象是同一个实例?

common-lisp - 在 Common Lisp 中提取正则表达式匹配

tree - 这真的是广度优先搜索吗

macos - 由于 sdl_delay,lispbuilder-sdl 在 osx 上不工作

functional-programming - 如何消除方案中此函数的可变性(N 皇后)

c - 为构建你自己的 Lisp 书滚动一个解析器?