函数引发错误'APPLY: argument list given to + is dotted'



我目前正在尝试编写一个以十进制返回列表平均值的函数。

(defun calc-list-average (lst)
(float (/ (apply '+ lst) (length lst))))

当我像这样调用函数时,一切正常:

(defvar *a-lst* '(5 6 1 3 6 7))
(princ (calc-list-average *a-lst*))


但是,当我尝试使用动态生成的列表调用函数时,我收到错误"给定 + 的参数列表是虚线(由 WUERFEL-ERGEBNIS 终止(">

(let ((wuerfel-seiten 6) (wuerfel-ergebnis ()))
(loop
(let ((menu-option (get-option)))
(cond ((eql menu-option 1)
(princ "Bitte geben Sie die Anzahl der Wuerfelseiten ein: ")
(setq wuerfel-seiten (read)))
((eql menu-option 2)
(princ "Bitte geben Sie die Anzahl der Wuerfelwuerfe ein: ")
(let ((wuerfel-wuerfe (read)))
(setq wuerfel-ergebnis (get-random-list wuerfel-seiten wuerfel-wuerfe))))
((eql menu-option 3)
(write-line "Wuerfelauswertung")
(princ (calc-list-average 'wuerfel-ergebnis))) ; <-- error is raised here
((eql menu-option 4)
(exit))))))

函数 get-option 只是将菜单打印到控制台,并返回用户写入控制台的任何内容。 get-random-list 返回一个列表,并被调用 (cap-number-of-elements(。

当你调用calc-list-average时,你传递的是符号wuerfel-ergebnis(基本上是变量的名称(而不是该符号的值。将呼叫更改为

(calc-list-average wuerfel-ergebnis)

也就是说,在wuerfel-ergebnis之前删除引号。这句话的意思是"不要评估接下来的内容"。但是,您确实希望评估符号wuerfel-ergebnis以获取其值。

这是错误"给+的参数列表是虚线"的解释。该函数apply需要一个列表。在Lisp中,列表要么是空列表()(也可以写nil(,要么是列表的第一个元素和列表其余元素的cons。例如'(1 2 3)等效于(cons 1 (cons 2 (cons 3 ())))。在正确的列表中,当您按照cons呼叫的右侧进行操作时,您最终会到达()。如果您以不同的方式使用cons,则可以构建一个不正确的列表,其中cons呼叫的右侧到达不()的内容。构建不正确列表的语法糖在尾随的非 nil 值之前使用点:(1 2 . "a")等效于(cons 1 (cons 2 "a"))。因此,"虚线列表"是"不当列表"的另一个名称。像wuerfel-ergebnis这样的(非 nil(符号是不正确的列表的特例,您在 0cons次调用后到达终点。

相关内容

最新更新