Приведение if к case
Поскольку булев тип является обычным перечислимым типом, оператор if может быть записан в форме case над булевым выражением:if выражение then КогдаИстинно(1); КогдаИстинно(2); else КогдаЛожно; end; case выражение when True then КогдаИстинно(1); КогдаИстинно(2); else КогдаЛожно; end;Обе записи синтаксически допустимы, логически тождественны, и потому должны порождать идентичный байт-код.
Оператор следования
Выявленные условия заставляют пересмотреть синтаксис операторов if и case, описанный ранее.Операторы if и case объединяются в единый оператор следования, имеющий общую форму case и сокращенную if, используемую для перечислимых типов с двумя значениями. Так if становится синтаксическим сахаром для для частного случая case, причем не только для булева типа.
Кроме того, поскольку ранее if допускал цепочки условий elsif, конструкция elsif теперь включается в общий оператор, становясь синтаксическим сахаром для вложенных if/case, без elsif требующих завершающий end на каждую вложенную ветвь.
Оператор следования теперь выглядит так:
case выражение1 when значение1_1 then ветвь; when значение1_2 then ветвь; when значение1_3 then ветвь; elsif выражение2 of when значение2_1 then ветвь; when значение2_2 then ветвь; else ветвь; end;Блок elsif может повторяться много раз. Аналогичная запись без elsif потребует явного вложения со своим завершающим end:
case выражение1 when значение1_1 then ветвь; when значение1_2 then ветвь; when значение1_3 then ветвь; else case выражение2 when значение2_1 then ветвь; when значение2_2 then ветвь; end; else ветвь; end;В байт-коде обе формы неразличимы. Использование или неиспользование elsif в case может выступать как параметр отекстовки.
Форма записи оператора if не претерпела изменений, старое описание верно.
Решение проблемы unless
Найдено также элегантное решение для аналога оператора unless — достаточно лишь разрешить писать else сразу за условием if, тем самым сделав ветвь then необязательной:if условие else ветвь; end;Поскольку ветвь else всегда стоит последней, эта форма if безальтернативна.
Пролог и эпилог
Предыдущая форма оператора case имела пролог — блок операторов, выполнявшийся перед операторами ветви, если хоть одна ветвь выбрана. Необходимость в прологе, а также возможное добавление эпилога по ключевому слову default рассматривалось, но в данный момент выглядит спорным. Вместо пролога и эпилога всегда можно использовать замыкания, задаваемые префиксом with, придется лишь дать им имена. Стоит ли экономия на именах введения новых сущностей, пока решается. В данной статье оператор case записан без of, подразумевая отсутствие пролога.Переосмысление форм записи условий отразится и на операторах цикла, которые тоже будут пересмотрены. Наличие эпилога в циклах имеет особый смысл, и решение проблемы прологов/эпилогов отложено до пересмотра циклов.
Комментариев нет :
Отправить комментарий
Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.
Примечание. Отправлять комментарии могут только участники этого блога.