TL; DR: when
handelt von Nebenwirkungen, and
ist für reine Boolesche Ausdrücke.
Wie Sie bemerkt haben, and
und when
unterscheiden sich nur in der Syntax, sind aber ansonsten völlig gleichwertig.
Der syntaktische Unterschied ist jedoch sehr wichtig: Es wird when
ein Implizit progn
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 Sie progn
keines der Argumente explizit umbrechen , ist der Wert jeder Argumentform wichtig, und kein Wert wird jemals ignoriert .
Daher ist der eigentliche Unterschied zwischen and
und when
stilistisch: Sie verwenden ihn and
für reine boolesche Ausdrücke und when
um nebenwirkende Formen zu schützen.
Daher sind dies schlechte Stile:
;; `when' used for a pure boolean expression
(let ((use-buffer (when (buffer-live-p buffer)
(file-exists-p (buffer-file-name buffer)))))
...)
;; `and' used as guard around a side-effecting form
(and (buffer-file-name buffer) (write-region nil nil (buffer-file-name buffer)))
Und das sind gute:
(let ((use-buffer (and (buffer-live-p buffer)
(file-exists-p (buffer-file-name buffer)))))
...)
(when (buffer-file-name buffer)
(write-region nil nil (buffer-file-name buffer)))
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 nur if
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 werden if
.