¿Qué es una función?
Para entender por qué sucede esto, necesitamos saber qué es una función. Al evaluar el formulario lisp (myfunc arg1 arg2 ...)
, emacs primero verifica qué myfunc
es. Si se trata de una función, Emacs evalúa todas las formas Lisp arg1
, arg2
, etc, entonces llama a la función myfunc
con los objetos Lisp resultantes como argumentos.
Como se señaló, and
no es una función, es una forma especial, por lo que puede evaluar sus argumentos según sea necesario. Como di en un comentario anterior, el formulario (and nil (drop 'bomb))
es seguro porque (drop 'bomb)
nunca se evalúa.
Por otro lado, (apply #'and (list nil (drop 'bomb)))
no es seguro, porque apply
es una función, por lo que emacs primero evalúa #'and
(el resultado es un símbolo), luego evalúa (list nil (drop 'bomb))
, que nuevamente es una llamada a función, por lo que adivina lo que sucede a continuación: nil
se evalúa, luego (drop 'bomb)
se evalúa.
¿Por qué se apply
queja?
Intentar usarlo apply
en una forma especial (o una macro) no tiene sentido, porque la forma especial no puede tener su comportamiento especial, por lo que arroja un error.
and
es una forma especial en lugar de una función.