TL; DR: when handelt von Nebenwirkungen, andist für reine Boolesche Ausdrücke.
Wie Sie bemerkt haben, andund whenunterscheiden sich nur in der Syntax, sind aber ansonsten völlig gleichwertig.
Der syntaktische Unterschied ist jedoch sehr wichtig: Es wird whenein Implizit prognum alle außer den ersten Argumentformen gewickelt. prognist 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 whenist 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.
andAuf der anderen Seite handelt es sich um eine reine Funktion, deren Hauptzweck darin besteht, die Rückgabewerte der angegebenen Argumentformen zu betrachten: Sofern Sie prognkeines der Argumente explizit umbrechen , ist der Wert jeder Argumentform wichtig, und kein Wert wird jemals ignoriert .
Daher ist der eigentliche Unterschied zwischen andund whenstilistisch: Sie verwenden ihn andfür reine boolesche Ausdrücke und whenum 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 andNebenwirkungen 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 ifdie 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.