Автор Тема: Сириус - обероноподобный язык и компилятор  (Прочитано 76471 раз)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Не, ветка ELSE выполняется один раз, когда/если условие прохождения цикла # TRUE, а ветка CLOSE это финализатор блока WHILE, который будет выполнен всегда при выходе из цикла, включая выход по RETURN , EXIT и трапу

DIzer

  • Гость
жуть, и мрак  :( - есть сильное предположение , что Сириус -жуткий DSL....

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
а в чем жуть?

Секция CLOSE - просто финализатор
может использоваться в блоках BEGIN END, WHILE END, CASE END, WITH END
Приблизительный аналог try finally в Delphi

DIzer

  • Гость
языковая конструкция плохо ложится на семантику высокоуровневых алгоритмов общего вида , и поэтому трудна в освоении.. но, разумеется, если Сириус - чистый DSL (в области его использования такие блоки  ЧАСТЫЙ гость) - то это не  проблема.... Впрочем, интересны соображения форумчан по этому поводу... ИМХО моя оценка не изменилась после вашего  уточнения.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Видимо дело в привычке ))
Для меня уже код типа
BEGIN
  F := Files.Open ( Name, {} );
  Server.Connect ( params );
....
CLOSE
  Files.Close ( F );
  Server.Disconnect;
END;
вполне высокоуровневый, понятный и безопасный, потому что гарантирует закрытие файлов/соединений и т.д.

DIzer

  • Гость
Видимо дело в привычке ))
Для меня уже код типа
BEGIN
  F := Files.Open ( Name, {} );
  Server.Connect ( params );
....
CLOSE
  Files.Close ( F );
  Server.Disconnect;
END;
вполне высокоуровневый, понятный и безопасный, потому что гарантирует закрытие файлов/соединений и т.д.
  ;)  не переводите стрелки... я говорил про конструкцию WHILE

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
вполне высокоуровневый, понятный и безопасный, потому что гарантирует закрытие файлов/соединений и т.д.

А почему не отдельный try/finally? Кстати, исключения в сириусе есть?

DIzer

  • Гость
вполне высокоуровневый, понятный и безопасный, потому что гарантирует закрытие файлов/соединений и т.д.

А почему не отдельный try/finally? Кстати, исключения в сириусе есть?
А зачем Vlad- если вы ЛЮБОЙ блок (последовательность операторов заключенную в скобки BEGIN END - как явную так и нет(последняя реализуется в управляющих конструкциях)) можете сделать try/finally просто добавив секцию CLOSE.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
BEGIN
  F := Files.Open ( Name, {} );
  Server.Connect ( params );
....
CLOSE
  Files.Close ( F );
  Server.Disconnect;
END;
Хотелось бы, чтобы ты привёл побольше примеров подобных идиом программирования на языке Сириус. Если просто перечислять какие фичи есть, то не очевидно как они друг с другом связаны. А вот в совокупности в виде паттернов-идиом -- другое дело. Например, в Обероне "шина сообщений" совершенно не очевидна из описания языка, а как только про неё узнаешь так сразу становится понятно почему Оберон сделан именно таким.

DIzer

  • Гость
Хотелось бы, чтобы ты привёл побольше примеров подобных идиом программирования на языке Сириус. Если просто перечислять какие фичи есть, то не очевидно как они друг с другом связаны. А вот в совокупности в виде паттернов-идиом -- другое дело. Например, в Обероне "шина сообщений" совершенно не очевидна из описания языка, а как только про неё узнаешь так сразу становится понятно почему Оберон сделан именно таким.
Интересно... всегда считал , что "шина сообщений" всего лишь  дизайн разрешения определенной проблемы (буржуи такие вещи называют "blue prints" или  "cooking recipes")

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
;)  не переводите стрелки... я говорил про конструкцию WHILE
И в мыслях не было.
Что касается блока WHILE, то секция ELSE больше относится к синтаксическому сахару, позволяя объединить в одну конструкцию логически связанный код. Когда после цикла обычно ставится проверка условия для того, чтобы определить, достигли мы результата в цикле или нет, логично эту часть поместить в блок цикла, потому что это логически связанные участки кода. Эта конструкция позаимствована из Графического Паскаля ( графический не от слова графика, а от слова граф ) для ДВК и других машин с ОС RT-11,, в котором конструкции WHILE и FOR были именно в таком виде, не в виде текста, там был специальный редактор, а в иде графа - вообще хорошая была разработка, жаль всё вместе со страной уничтожили.
А раз у нас в WHILE появляется секция ELSE, то логично и секцию финализации CLOSE поместить в этот блок, чтобы иметь возможность выполнить завершающие операции или просто один и тот же код для разных секций, а также организовать обработку ошибок в одном месте, потому что секция CLOSE позволяет либо  перехватить обработку исключений ( с соответствующим модификатором ), либо ( без модификатора) просто выполнить завершающие операции после завершения стандартной обработки.
Т.е. в итоге получается замкнутый, логически целостный блок.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
А почему не отдельный try/finally?
Смысла нет - секция CLOSE и так может находится почти в любом блоке.
Кстати, исключения в сириусе есть?
И да и нет )))
На уровне языка определены только стандартные ASSERT и HALT, а также модификатор для секции CLOSE - CLOSE [ ALL ]  или CLOSE [ EXCEPTION ].
Без этих модификаторов управление на секцию CLOSE будет передано после стандартной обработки исключений, с модификатором - в секцию, где это можно будет обработать. Работа с исключениями осуществляется методами модуля Exceptions.
Например
BEGIN
  Exceptions.Raise ( NEW (MyExceptionType, ErrorCode, Message) );
CLOSE [ EXCEPTION ]
  IF Exceptions.LastContext() = Exceptions.ThisContext () THEN
  (* обработаем  исключение *)
    IF Exceptions.CurrentException() IS MyExceptionType THEN
      ...
      Exceptions.CloseException; (*  если исключение не закрыть, оно будет обработано далее по цепочке контекстов пока не будет закрыто *)
    END;
(* или через тикеты
IF Exceptions.NextTicket()...
IF Exceptions.CurrentTicken() IS MyExceptionsType ...
Exceptions.CloseTicket (Exceptions.CurrentTucket());
Exceptions.CloseAllTikets ( Exceptions.SelectTicketsByType ( Exceptions.CurrentTicket() )
*)
 END;

DIzer

  • Гость
;)  не переводите стрелки... я говорил про конструкцию WHILE
И в мыслях не было.
Что касается блока WHILE, то секция ELSE больше относится к синтаксическому сахару, позволяя объединить в одну конструкцию логически связанный код. Когда после цикла обычно ставится проверка условия для того, чтобы определить, достигли мы результата в цикле или нет, логично эту часть поместить в блок цикла, потому что это логически связанные участки кода. Эта конструкция позаимствована из Графического Паскаля ( графический не от слова графика, а от слова граф ) для ДВК и других машин с ОС RT-11,, в котором конструкции WHILE и FOR были именно в таком виде, не в виде текста, там был специальный редактор, а в иде графа - вообще хорошая была разработка, жаль всё вместе со страной уничтожили.
А раз у нас в WHILE появляется секция ELSE, то логично и секцию финализации CLOSE поместить в этот блок, чтобы иметь возможность выполнить завершающие операции или просто один и тот же код для разных секций, а также организовать обработку ошибок в одном месте, потому что секция CLOSE позволяет либо  перехватить обработку исключений ( с соответствующим модификатором ), либо ( без модификатора) просто выполнить завершающие операции после завершения стандартной обработки.
Т.е. в итоге получается замкнутый, логически целостный блок.
Да , ELSE я и имел ввиду - ибо если цикл спроектирован правильно то условие, всегда будет ложными (ибо вычисляется на каждой итерации) по этому блок следующий за циклом  всегда будет выполняться -если нужна проверка , то достаточно вставить IF  блок сразу  после цикла - кроме того, такой блок неизбежен если требуется проверить условие чуть отличающееся (но являющееся комбинацией  параметров в условии цикла ) или скажем какой -либо инвариант - и секция ELSE здесь не поможет . Если произошел выход по другой причине - то им может быть только брейк(есть ли он?) - все остральные варианты  будут игнорировать эту секцию..

DIzer

  • Гость
Далее из синтаксиса не очевидно , что CLOSE будет срабатывать после  сбоя в  цикле (а не в секции ЕLSE) .  Упоминание заимствований из графного Паскаля - убедило меня  еще более в сильном влиянии предметной области на Сириус.

DIzer

  • Гость
Последнее... говоря "жуткий DSL" - я имел ввиду сильную ориентированность  на предметную область (без негатива ассоциируемым  со словом жуть). В этой связи не очень понимаю смысл "рассекречивания" Сириуса. Но если это и произойдет.. то не вижу смысла в сокрытии среды разработки...- хорошая среда учитывающая спицифику DSL-большой вклад в продвижение языка.
« Последнее редактирование: Май 22, 2012, 08:30:56 am от DIzer »