我可以在 LISP 中使用关键字参数
(member 'a '(a b c) :test #'eq)
但是,当我尝试使用 apply 来调用成员方法时
(apply #'member 'a '(a b c) :test #'eq)
我有如下错误消息:
MEMBER: keyword arguments in (:TEST) should occur pairwise
[Condition of type SYSTEM::SIMPLE-PROGRAM-ERROR]
解决方案是
(apply #'member 'a '(a b c) '(:test eq))
而没有关键字参数
(apply #'member 'a '((a b c)))
这背后的逻辑是什么?为什么 '(:test #'eq) 会引发错误?
添加
这就是我问这个问题的原因。我有来自 ANSI Common Lispbook 第 103 页的代码。
(defun our-adjoin (obj lst &rest args)
(if (apply #'member obj lst args)
lst
(cons obj lst)))
当我尝试(our-adjoin 'a '(a b c))
它返回结果(A B C)
时,但 our-adjoin 不能翻译为(apply #'member 'a '(a b c))
,因为它会引发错误(如Apply 和 lisp 中的关键字参数中所要求的那样)。
我能想到的是,&rest args
给出的值是为了(apply #member 'a '(a b c) '())
不引发错误。