我一直在环顾四周,仍然不明白 funcall 是如何工作的。如果有人可以就解决问题的方法给我一个建议,我将不胜感激。我知道“有趣”必须是一个谓词函数,但在那之后我被困住了
顺便说一句,如果在将该项目用作函数的参数时函数返回 true,则该项目满足函数。
我一直在环顾四周,仍然不明白 funcall 是如何工作的。如果有人可以就解决问题的方法给我一个建议,我将不胜感激。我知道“有趣”必须是一个谓词函数,但在那之后我被困住了
顺便说一句,如果在将该项目用作函数的参数时函数返回 true,则该项目满足函数。
(funcall '+ 1 2 3)
返回相同的结果(+ 1 2 3) => 6
优点是在前一种情况下,函数可以是变量。
(setq fun '+)
(funcall fun 1 2 3) => 6
一个类似的函数是 apply ,其中参数被分组到一个列表中:
(apply '+ '(1 2 3)) => 6
(funcall #'+ 1 2 3 4 5 6 7 8)
; ^ -------+-------
; | |
; | Arguments
; Function
; returns 36
对于您的问题:
(defun fun-satisfiers (pred-fun list)
(let ((acc nil))
(do ((l list (cdr l)))
((null l) (nreverse acc))
(if (funcall pred-fun (car l))
(setf acc (cons (car l) acc))))))
这种函数已经存在于基础 common-lisp 中filter
。