我是一名自学习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
函数完成它。
答案 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))