# 'und ist eine ungültige Funktion?

7

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.

PythonNut
quelle
1
andist eher eine spezielle Form als eine Funktion.
Dan
2
Sie sollten eine Funktion mit dem gewünschten Verhalten verwenden, z. B. (cl-every 'identity lst)oder (-all? 'identity lst).
Wasamasa
@wasama danke. Ich werde das stattdessen tun.
PythonNut

Antworten:

5

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

und ist eine spezielle Form im C-Quellcode.

(und BEDINGUNGEN ...)

Eval argumentiert, bis einer von ihnen Null ergibt, und gibt dann Null zurück. Die verbleibenden Argumente werden überhaupt nicht ausgewertet. Wenn kein Argument Null ergibt, geben Sie den Wert des letzten Arg zurück.

[zurück]

Obwohl es sich wie eine Funktion verhält, ist es keine. Der gleiche Fehler wird durch die Verwendung von a macroanstelle von generiert and.

Jonathan Leech-Pepin
quelle
7
Es verhält sich nicht wie eine Funktion: Es hört auf, Argumente auszuwerten, sobald eines von ihnen Null ist. (and nil (drop 'bomb))ist sicher, solange andes keine Funktion ist.
YoungFrog
3

Um zu ergänzen und zusammenzufassen, was andere gesagt haben:

(functionp 'and) ; ===> nil

Ende der Geschichte.

Aus dem Elisp-Handbuch, Knoten Was ist eine Funktion :

Mit der Funktion können Sie functionptesten, ob ein Objekt eine Funktion ist:

- Funktion: functionp object Diese Funktion wird zurückgegeben, twenn OBJECT eine Funktion ist, dh an die übergeben werden kann funcall. Beachten Sie, dass functionpRenditen tfür Symbole , die Funktionsnamen sind, und gibt ‚Null‘ für Sonderformen.


(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 ‘...’.)

Drew
quelle
1

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.

Junger Frosch
quelle