Dies ist eine Fortsetzung der Kommentare zu dieser Antwort . Die folgenden Codebits scheinen äquivalent zu sein:
(and a b)
(when a b)
Natürlich and
können Sie mehr Bedingungen stellen: (and a b c d)
bedeutet(when (and a b c) d)
Ich neige dazu, when
nur Verzweigungen auszudrücken. Gibt es tatsächliche Unterschiede? Ist es besser das eine oder andere zu benutzen?
Ich habe keine Emacs C-Quelle zur Hand; and
ist eine C-Funktion; when
ist ein Makro, das erweitert if
wird und selbst eine C-Funktion ist.
elisp
elisp-macros
conditionals
Clément
quelle
quelle
Antworten:
TL; DR:
when
handelt von Nebenwirkungen,and
ist für reine Boolesche Ausdrücke.Wie Sie bemerkt haben,
and
undwhen
unterscheiden sich nur in der Syntax, sind aber ansonsten völlig gleichwertig.Der syntaktische Unterschied ist jedoch sehr wichtig: Es wird
when
ein Implizitprogn
um alle außer den ersten Argumentformen gewickelt.progn
ist ein von Natur aus unerlässliches Merkmal: Es bewertet alle Körperformen außer der allerletzten nur auf ihre Nebenwirkungen und verwirft dabei den jeweils zurückgegebenen Wert.Als solches
when
ist es auch eine zwingende Form: Ihr Hauptzweck ist es, nebenwirkende Formen zu verpacken, da nur der Wert der allerletzten Form tatsächlich für den Körper von Bedeutung ist.and
Auf der anderen Seite handelt es sich um eine reine Funktion, deren Hauptzweck darin besteht, die Rückgabewerte der angegebenen Argumentformen zu betrachten: Sofern Sieprogn
keines der Argumente explizit umbrechen , ist der Wert jeder Argumentform wichtig, und kein Wert wird jemals ignoriert .Daher ist der eigentliche Unterschied zwischen
and
undwhen
stilistisch: Sie verwenden ihnand
für reine boolesche Ausdrücke undwhen
um nebenwirkende Formen zu schützen.Daher sind dies schlechte Stile:
Und das sind gute:
Ich weiß, dass einige Leute darüber nicht einverstanden sind und gerne
and
Nebenwirkungen abwehren, aber ich denke, dass dies wirklich ein schlechter Stil ist. Wir haben diese verschiedenen Formen aus einem Grund: Syntax zählt . Andernfalls würden wir alle nurif
die einzige Bedingungsform verwenden , die Sie in Emacs Lisp semantisch wirklich benötigen. Alle anderen booleschen und bedingten Formen können in Bezug auf geschrieben werdenif
.quelle
and
ist über das Sorgen über den Rückgabewert . Es geht nicht unbedingt nicht darum, Nebenwirkungen zu nutzen. Wenn sich mein Programm um den Rückgabewert kümmert, verwende ichand
. Wenn nicht, dann benutze ichwhen
. IOW benutze ichwhen
nur für Nebenwirkungen, aber ich könnte gut einenprogn
in einem der Argumente verwendenand
. Es geht darum, ob es auf den Rückgabewert ankommt, nicht darum, ob es allein darauf ankommt.and
ist in keiner mir bekannten Sprache eine Funktion. In Emacs Lisp ist es eine spezielle Form, in Common Lisp ist es ein Makro, einfach weil Kurzschlussverhalten erwartet wird (unmöglich mit Funktionen zu erreichen, weil sie immer ihre Argumente auswerten).and
es eine Funktion ist, wenn es nicht so ist. Es ist egal, wie relevant die Tatsache für die Frage ist, wir sollten immer die richtigen Begriffe verwenden, das ist alles.nil
"falsch", "die leere Liste", "nichtig" usw. bedeuten. Zum Beispiel in Scheme and Racket das unwahre Ergebnis vonwhen
istvoid
(dh "keine Bedeutung"), wohingegenand
es ist#f
("falsch"). Obwohl dies für Elisp nicht zutreffend ist, könnte es ein Lisp-Generalist in Betracht ziehen.Lassen Sie mich damit beginnen
(and a b)
und(when a b)
in Ihrem Beispiel dasselbe tun: Zuersta
wird ausgewertet.b
wenn ausgewerteta
ist wahr # .Aber
and
undwhen
werden für verschiedene Dinge verwendet.Sie würden verwenden
(and a b)
zurückzukehren wahr # wenn beidea
undb
sind wahr # (oder Nicht-Null); undnil
sonst.Sie würden
(when a b)
oder mehr richtig sein,Wenn Sie möchten, dass der Code "b" genau dann ausgeführt
a
wird, wenn " true" # ist .Hier ist ein Beispiel, in dem Sie
when
undand
zusammen verwenden:Oben, die Funktion
do-c
wird nur , wenn beide genannta
undb
ist wahr # .Referenzen für das Studium
when
Abschnitt hier)and
Abschnitt hier)# Alle Verweise auf true beziehen sich auf den Booleschen Wert TRUE.
quelle
and
Gibt nicht zurück,t
wenn alle Argumente nicht null sind, sondern der Wert des letzten Arguments.t
meine ich den Booleschen Wert WAHR oder Nicht-Null. Danke, das werde ich in meiner Antwort klarstellen.(when (and a b) c)
). Außerdem gibt der Teil darüber, wieand
undwhen
wie sie im Allgemeinen verwendet werden, Hinweise darauf, dass dies tatsächlich der Fall ist. Die eigentliche Grundlage für diese Frage war jedoch die Tatsache, dass ich sie häufig anders sehe (siehe zum Beispiel die Antwort, auf die ich in meiner Frage verwiesen habe).