我目前正在尝试编写一个以十进制返回列表平均值的函数。
(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
次调用后到达终点。