O que é uma função?
Para entender por que isso acontece, precisamos saber o que é uma função. Ao avaliar o formulário lisp (myfunc arg1 arg2 ...)
, o emacs primeiro verifica o que myfunc
é. Se for uma função, emacs avalia todas as formas Lisp arg1
, arg2
etc., em seguida, chama a função myfunc
com os objetos Lisp resultantes como argumentos.
Como foi observado, and
não é uma função, é uma forma especial, portanto, ele pode avaliar seus argumentos conforme necessário. Como eu disse em um comentário anterior, o formulário (and nil (drop 'bomb))
é seguro porque (drop 'bomb)
nunca é avaliado.
Por outro lado, (apply #'and (list nil (drop 'bomb)))
não é seguro, porque apply
é uma função, então o emacs avalia primeiro #'and
(o resultado é um símbolo), depois avalia (list nil (drop 'bomb))
, que é novamente uma chamada de função, para que você adivinhe o que acontece a seguir: nil
é avaliado e, em seguida, (drop 'bomb)
avaliado.
Por que apply
reclama?
Tentar usar apply
em um formulário especial (ou macro) não faz sentido, porque o formulário especial não pode ter seu comportamento especial; portanto, gera um erro.
and
é uma forma especial e não uma função.