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 myfuncist. Wenn es eine Funktion ist, wertet Emacs Lisp alle Formulare arg1, arg2etc. ruft dann die Funktion myfuncmit den daraus resultierenden Lisp - Objekte als Argumente.
Wie bereits erwähnt, andhandelt 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: nilwird ausgewertet und dann (drop 'bomb)ausgewertet.
Warum applybeschwert sich?
Der Versuch, applyein 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.
andist eher eine spezielle Form als eine Funktion.