Was ist eine Funktion?
Um zu verstehen, warum dies geschieht, müssen wir wissen, was eine Funktion ist. Bei der Auswertung der Lisp-Form (myfunc arg1 arg2 ...)
prüft emacs zunächst, was myfunc
ist. Wenn es eine Funktion ist, wertet Emacs Lisp alle Formulare arg1
, arg2
etc. ruft dann die Funktion myfunc
mit den daraus resultierenden Lisp - Objekte als Argumente.
Wie bereits erwähnt, and
handelt es sich nicht um eine Funktion, sondern um eine spezielle Form, sodass die Argumente nach Bedarf ausgewertet werden können. Wie ich bereits in einem Kommentar erwähnt habe, ist das Formular (and nil (drop 'bomb))
sicher, da (drop 'bomb)
es nie ausgewertet wird.
Auf der anderen Seite (apply #'and (list nil (drop 'bomb)))
ist es nicht sicher, da apply
es sich um eine Funktion handelt, sodass emacs zuerst auswertet #'and
(das Ergebnis ist ein Symbol) und dann auswertet (list nil (drop 'bomb))
, was wiederum ein Funktionsaufruf ist. Sie raten also, was als nächstes passiert: nil
wird ausgewertet und dann (drop 'bomb)
ausgewertet.
Warum apply
beschwert sich?
Der Versuch, apply
ein spezielles Formular (oder ein Makro) zu verwenden, ist nicht sinnvoll, da das spezielle Formular möglicherweise kein spezielles Verhalten aufweisen kann und daher einen Fehler auslöst.
and
ist eher eine spezielle Form als eine Funktion.