我有以下 lisp 代码
(defun sum (vec)
"Summiert alle Elemente eines Vektors."
(apply '+ vec))
(defun square (item)
"Hilfsfunktion zum Quadrieren eines Elements."
(* item item))
(defun calcVarianz (vec)
"Berechnet die Varianz eines Vektors."
(loop with len = (length vec)
with mean = (/ (sum vec) len)
with some_func = (lambda (x) (* x x))
; causes the error
for item in vec
collecting (square (- item mean)) into squared
collecting (some_func item) into some_vector
; some_func cannot be found
finally (return (/ (sum squared) (- len 1)))))
效果很好(即计算向量的方差)。
现在,我想知道是否可以在构造中将sum
和square
函数定义为 lambda loop
,但一路上陷入困境。这可以用例如
with sum = (lambda (x) ...)
出现错误
The function COMMON-LISP-USER::SOME_FUNC is undefined.
[Condition of type UNDEFINED-FUNCTION]
我在这里缺少什么?
如果将符号绑定到需要使用的函数
funcall
或apply
尝试使用符号调用函数时:这是因为通常在绑定符号时会绑定值槽,而在这种情况下,值槽会与函数的值绑定。当遇到一个符号作为 cons 的第一个元素时,将检查函数槽是否有该函数,这是一个不同的命名空间。这就是需要
funcall
(或apply
) 的原因:它们将符号的普通值强制为函数值。你可以使用
apply
,替换和