TL; DR : when
부작용에 관한 것 and
입니다. 순수한 부울 식입니다.
당신은 눈치 챘을,로 and
및 when
구문 만 다른,하지만 그렇지 않으면 완전히 동일합니다.
구문상의 차이는 매우 중요 하지만 첫 번째 인수 형식을 제외한 모든 when
것을 암시 적 progn
으로 감 쌉니다 . progn
본질적으로 필수적인 기능입니다. 마지막 신체 형태를 제외한 모든 신체 부작용을 평가하여 그들이 반환 한 값을 버립니다.
따라서 when
가장 중요한 형태의 가치 만 실제로 신체에 중요하기 때문에 부작용이있는 형태를 포장하는 것이 주된 목적입니다.
and
반면에, 주어진 인수 형식의 반환 값을 보는 것이 주 목적인 순수한 함수입니다. 인수를 명시 적으로 감싸지 않는 한 progn
모든 인수 형식의 값이 중요하며 값이 무시되지 않습니다. .
따라서, 사이의 진정한 차이 and
와 when
문체입니다 : 당신이 사용하는 and
순수 부울 표현식 및 when
측면 초래 형태의 주위에 경비를 넣어.
따라서 이들은 나쁜 스타일입니다.
;; `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)))
그리고 이것들은 좋습니다 :
(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)))
나는 어떤 사람들이 이것에 동의하지 않고 행복하게 and
부작용을 지키기 위해 사용한다는 것을 알고 있지만, 이것이 실제로 나쁜 스타일이라고 생각합니다. 이유는 다음과 같은 여러 가지 형태입니다. 구문 문제 . 그렇지 않다면, 우리 if
는 Emacs Lisp에서 실제로 의미 적으로 유일하게 필요한 조건부 양식 인을 사용합니다. 다른 모든 부울 및 조건부 양식은의 용어로 작성할 수 있습니다 if
.