Eu tenho o seguinte código 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)))))
o que funciona muito bem (isto é, calcula a variação de um vetor).
Agora, eu queria saber se alguém poderia definir as funções sum
e square
como lambda dentro da loop
construção, mas fiquei preso no caminho. Isso é possível com, por exemplo
with sum = (lambda (x) ...)
Recebi o erro
The function COMMON-LISP-USER::SOME_FUNC is undefined.
[Condition of type UNDEFINED-FUNCTION]
O que estou perdendo aqui?
Se você vincular um símbolo a uma função que precisa usar
funcall
ouapply
ao tentar chamar a função usando o símbolo:Isso ocorre porque normalmente o slot de valor é vinculado ao vincular um símbolo e, neste caso, o slot de valor é vinculado ao valor da função. Quando um símbolo é encontrado como o primeiro elemento de um cons, o slot de função é verificado para a função e este é um namespace diferente. É por isso que
funcall
(ouapply
) é necessário: estes forçam o valor ordinário de um símbolo a um valor funcional .Você poderia usar
apply
, substituindocom