Долгое время при использовании Emacs-lisp меня интересовало назначение конструкций when
и unless
. Мне показалось, что это просто обходной путь для более хороших отступов и уменьшения вложенности, т.е.
(if (this-is-true) (when (this-is-true) | (if (not (this-is-true)) (unless (this-is-true)
(progn --\ (do-this) | (progn --\ (do-this)
(do-this) --/ (do-that)) | (do-this) --/ (do-that))
(do-that))) | (do-that)))
Однако теперь, когда я профессионально работаю программистом и, следовательно, чаще с кодом других людей, у меня есть часто встречающиеся ситуации, когда
// ALGOL style curly-braces ! Fortran # Shell scripts
if(this) { IF(THIS) THEN if this_condition; then
then_than(); DO_THAT do_that
... ... ...
заставлял меня карабкаться, чтобы увидеть, есть ли какие-то предложения или предложения if-else. Аналогичен операторам стиля switch
или case
и наличию предложения default
, демонстрируя реальное когнитивное преимущество более ограниченных форм when
и unless
по сравнению с использованием простых if
, т.е. они улучшают выразительность.
Это заставило меня задуматься: какие еще языки существуют вне вариантов lisp, у которых есть встроенное понятие «если не так», если? Возможно, есть даже языки, которые пытаются принудительно использовать различные конструкции, например, не разрешая if
без else
?