为什么在 Common Lisp 中需要偶数个关键字参数?

Why need even number of keyword parameters in Common Lisp?

我正在尝试在 Common Lisp 中实现尾调用递归阶乘,尝试一下并体验一下。

我复制了一些代码并用 Common Lisp 重写了它,如下所示:

(defun tailrecsum (x &key (running-total 0 running-total-p))
    (if (= x 0)
        (if running-total-p running-total 0)
        (tailrecsum (- x 1) (+ running-total x))))

但是,我首先收到警告:

SIMPLE-WARNING: 
The function has an odd number of arguments in the keyword portion.

尝试 运行 时,出现错误:

SIMPLE-PROGRAM-ERROR: 
odd number of &KEY arguments

为什么我不能有奇数个关键字参数?这有什么问题,我该怎么办?

例如在Python中我可以写:

def func(a, b=10):
    print([a, b])

所以我会有一个奇数个关键字参数。没有问题。

错误不是指关键字参数的个数;相反,它意味着您调用函数时使用的参数数量。由于定义的关键字参数需要成对出现 (:KEYWORD VALUE),因此参数数量为奇数意味着您一定遗漏了一些东西。

在这种情况下,您缺少

中的关键字
(tailrecsum (- x 1) (+ running-total x))

应该是

(tailrecsum (- x 1) :running-total (+ running-total x))