Ich versuche zu sehen, ob alle Werte in einer Liste wahr sind. Aus irgendeinem Grund (apply #'and lst)
Fehler mit:
Ungültige Funktion: und
Dies passiert auch, wenn ich es versuche (cl-reduce #'and lst)
.
Scheint (apply #'max lst)
jedoch gut zu funktionieren.
Im Moment benutze ich (eval `(and ,@lst))
, aber das fühlt sich hässlich an.
and
ist eher eine spezielle Form als eine Funktion.(cl-every 'identity lst)
oder(-all? 'identity lst)
.Antworten:
Dies ist wirklich nur eine teilweise Antwort (da ich nicht sagen kann, warum oder wirklich eine Problemumgehung dafür bieten kann, die über das hinausgeht, was Sie bereits haben).
Wie per
C-h f and
Obwohl es sich wie eine Funktion verhält, ist es keine. Der gleiche Fehler wird durch die Verwendung von a
macro
anstelle von generiertand
.quelle
(and nil (drop 'bomb))
ist sicher, solangeand
es keine Funktion ist.Um zu ergänzen und zusammenzufassen, was andere gesagt haben:
Ende der Geschichte.
Aus dem Elisp-Handbuch, Knoten Was ist eine Funktion :
(Mann, ich hasse das neue lockige Zitat in den Handbüchern. Lässt mich jedes von ihnen durch ersetzen,
`
nachdem ich es aus dem Handbuch hier eingefügt habe. Doppelt so viel Aufwand, als wenn das Handbuch (vernünftigerweise)`...'
anstelle von verwendet würde‘...’
.)quelle
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, wasmyfunc
ist. Wenn es eine Funktion ist, wertet Emacs Lisp alle Formularearg1
,arg2
etc. ruft dann die Funktionmyfunc
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, daapply
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.quelle