有人知道我为什么会出现这个错误吗?
EVAL/APPLY:给SUMTAIL的参数太少(1而不是至少2(。
(defun sum (n)
(sumTail 0 n)
)
(defun sumTail(r n)
(if (null n)
r
(sumTail (+ (first n) r) (rest n) )
)
)
(sumtail '(59 21 6 5 30 98 17 22 1 0))
首先,让我们重写函数,以便更好地阅读它们:
(defun sumTail (r n)
(if (null n)
r
(sumTail (+ (first n) r) (rest n))))
(defun sum (n)
(sumTail 0 n))
现在,很容易看出错误的原因:您用一个参数调用sumtail
:
(sumTail '(59 21 6 5 30 98 17 22 1 0))
而它已经被定义为需要两个参数来绑定到参数r
和n
。
但我们可以看到,sum
只需要一个参数,它用0
和列表正确地调用了sumtail
。
所以,当你只有一个论点时,你应该调用sum
:
CL-USER> (sum '(59 21 6 5 30 98 17 22 1 0))
259
请注意,sumTail
等效于sumtail
,因为在Common Lisp中,除非修改读取器,否则两个符号都读作SUMTAIL
。
最后,如果交换参数,您可以只使用一个函数:
(defun sumtail (n &optional (r 0))
(if (null n)
r
(sumTail (rest n) (+ (first n) r))))
CL-USER> (sumtail '(59 21 6 5 30 98 17 22 1 0))
259
这是因为我们已经将第二个参数定义为可选参数,如果没有提供,则初始值为0
。