Lisp:EVAL/APPLY:参数太少(1而不是至少2)

  • 本文关键字:APPLY 参数 Lisp EVAL common-lisp
  • 更新时间 :
  • 英文 :


有人知道我为什么会出现这个错误吗?

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))

而它已经被定义为需要两个参数来绑定到参数rn

但我们可以看到,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

最新更新