Это продолжение комментариев к этому ответу . Следующие биты кода кажутся эквивалентными:
(and a b)
(when a b)
Конечно, and
вы можете поставить больше условий: (and a b c d)
значит(when (and a b c) d)
Я склонен использовать when
только для выражения ветвления. Есть ли реальные различия? Лучше использовать один или другой?
У меня нет источника C Emacs под рукой; and
является функцией C; when
это макрос, который расширяется до if
, который сам является функцией C.
elisp
elisp-macros
conditionals
Клеман
источник
источник
Ответы:
TL; DR:
when
о побочных эффектах,and
для чистых логических выражений.Как вы заметили,
and
иwhen
отличаются только в синтаксисе, но в остальном полностью эквивалентны.Однако синтаксическая разница весьма важна:
when
неявная оболочкаprogn
охватывает все формы, кроме первого.progn
является неотъемлемой обязательной функцией: он оценивает все, кроме самой последней формы тела, только на предмет их побочных эффектов, отбрасывая все возвращенное значение.Как таковая,
when
это также императивная форма: ее главная цель - обернуть побочные формы, потому что только ценность самой последней формы действительно имеет значение для тела.and
с другой стороны, это чистая функция, основной целью которой является просмотр возвращаемых значений заданных форм аргументов: если вы явно не обернетесьprogn
вокруг какого-либо из его аргументов, значение каждой формы аргумента важно, и никакое значение никогда не игнорируется ,Следовательно, настоящее различие между
and
иwhen
заключается в стилистике: вы используетеand
для чисто логических выражений иwhen
для защиты от побочных эффектов форм.Следовательно, это плохой стиль:
И это хорошо
Я знаю, что некоторые люди не согласны с этим и радостно используют
and
для защиты от побочных эффектов, но я думаю, что это действительно плохой стиль. У нас есть эти различные формы по причине: синтаксис имеет значение . Если бы этого не произошло, мы бы все когда-либо использовалиif
, это единственная условная форма, которая вам действительно нужна в Emacs Lisp семантически. Все другие логические и условные формы могут быть записаны в терминахif
.источник
and
- это забота о возвращаемом значении . Это не обязательно не об использовании побочных эффектов. Если моя программа заботится о возвращаемом значении, тогда я используюand
. Если это не так, я используюwhen
. Я используюwhen
только для побочных эффектов, но я вполне мог бы использоватьprogn
в одном из аргументовand
. Речь идет о том вопросах , возвращаемое значение, а не о ли это только вопросы.and
это не функция ни в одном из Лиспов, о которых я знаю. В Emacs Lisp это специальная форма, в Common Lisp это макрос, просто потому, что ожидается его поведение при коротком замыкании (этого нельзя добиться с помощью функций, потому что они всегда оценивают свои аргументы).and
это функция, когда это не так. Неважно, насколько важен этот факт для вопроса, мы всегда должны использовать правильные термины, вот и все.nil
означает «ложь», «пустой список», «пустота» и т. Д. Например, в «Схеме и ракетке» неверный результатwhen
естьvoid
(то есть «нет смысла»), тогда как дляand
него#f
(«ложно»). Хотя это не относится к Elisp, это то, что может рассмотреть универсал Lisp.Позвольте мне начать с того, что
(and a b)
и(when a b)
в вашем примере сделать то же самое: во- первыхa
оценивается.b
оценивается , еслиa
это правда # .Но
and
иwhen
используются для разных вещей.Вы могли бы использовать ,
(and a b)
чтобы вернуть истинный # если ОБАa
иb
являются истинными # (или не ноль); иnil
иначе.Вы бы использовали
(when a b)
или, чтобы быть более правильным,когда вы хотите, чтобы код "b" выполнялся тогда и только тогда, когда
a
имеет значение true # .Вот пример, где вы используете
when
иand
вместе:Выше, функция
do-c
вызывается только если обаa
иb
являются правдой # .Рекомендации для учебы
when
раздел здесь)and
Раздел здесь)# Все ссылки на true ссылаются на логическое значение TRUE.
источник
and
не возвращается,t
если все его аргументы не равны нулю, но значение последнего аргумента.t
, я имел в виду логическое значение ИСТИНА или не-ноль. Спасибо, уточню в своем ответе.(when (and a b) c)
). Кроме того, часть о том, какand
иwhen
предполагает, что это на самом деле, как они используются в целом, но сама основа для этого вопроса был факт, что я часто вижу их использование по-разному (см., Например, ответ, который я связал в моем вопросе).