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

Common lisp 为什么在公共Lisp中需要偶数个关键字参数?,common-lisp,keyword-argument,Common Lisp,Keyword Argument,我正在尝试在CommonLisp中实现尾部调用递归阶乘,尝试一下并体验一下 我复制了一些代码,并用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)))) 然

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

我复制了一些代码,并用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])

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

错误与关键字参数的数量无关;而是指调用函数的参数数量。由于关键字参数按定义需要成对(
:关键字值
),因此具有奇数个参数意味着您必须缺少某些内容

在本例中,您缺少中的关键字

(tailrecsum (- x 1) (+ running-total x))
应该是哪一个

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

您在呼叫中缺少关键字:
(tailrecsum(-x1)(+running total x))
=>
(tailrecsum(-x1):running total(+running total x))
@jkiiski您能回答这个问题吗?那我就可以接受了。不知怎的,它仍然说
控制堆栈保护页暂时禁用:继续小心Control-stack-expensed:#Out[46]:
,但高于
(print(tailrecsum 19469))
=(您使用的是什么实现?您是否设置了任何优化质量?似乎尾部递归没有被优化。我在SBCL上没有这个问题。我使用的是SBCL 1.3.8。我了解到一些实现没有TCO,因为它不是任何通用LISP标准所要求的,但SBCL应该有它。我想cl jupyter必须有它正在设置调试的优化质量(例如
(DECLAIM(OPTIMIZE(DEBUG 3)))
),这将禁用SBCL上的TCO。