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