Автор Тема: [Oberon rev 2013] CASE  (Прочитано 16180 раз)

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: [Oberon rev 2013] CASE
« Ответ #15 : Ноябрь 07, 2013, 08:33:41 pm »
Не на пустом месте да, но невнимательность при редактировании это не отменяет. У меня в документации коллеги такие же дыры находят, хотя я ее сам по горячим следам дописываю.

Цитировать
А что делать если ELSE нет, также не сказано. Может трап должен быть, а может и нет.
Если с такой позиции смотреть, то да - и в CASE не должно происходить останова. Поскольку в IF его точно не должно быть. Хотя кто знает :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon rev 2013] CASE
« Ответ #16 : Ноябрь 07, 2013, 08:40:52 pm »
Цитировать
А что делать если ELSE нет, также не сказано. Может трап должен быть, а может и нет.
Если с такой позиции смотреть, то да - и в CASE не должно происходить останова. Поскольку в IF его точно не должно быть. Хотя кто знает :)
На самом деле, сколь я помню, HALT при отсутствующем ELSE (то есть когда ничего не случилось из ожидаемого) рассматривался: http://forum.oberoncore.ru/viewtopic.php?f=82&t=3484

Сделать экспериментальный мод для языка не сложно. Но мод сделать мало, нужны еще ресурсы на то, чтобы полноценно это дело обкатать и опробовать. Пока у нас вроде бы ресурсов на это нет - мы Оберон то в последней ревизии еще не обкатали со всех сторон (на разных платформах там, с разными биндингами, для разных задач разными людьми) :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: [Oberon rev 2013] CASE
« Ответ #17 : Ноябрь 08, 2013, 07:44:56 am »
То были просто размышления. И если для многоветочного он ещё и может иметь смысл, то для одноветочного - это точно перебор, а разное поведение для одной и той же конструкции, в зависимости от конфигурации ясности программе не даст.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: [Oberon rev 2013] CASE
« Ответ #18 : Ноябрь 08, 2013, 10:14:31 am »
Также в отчете не сказано о том, что метки не могут пересекаться. Возможно, Никлаус Вирт действительно невнимательно отредактировал отчет, такое с ним случалось и прежде.
Посмотрел репорт 2013 года, - и правда, - нигде не сказано, что метки выбора не должны дублироваться. И всё же я думаю, что если задать Вирту прямой вопрос, то он ответит: "Конечно, не могут дублироваться".
Как писал Патрик:
Цитата: Patrik Reali
Оригинальное сообщение о языке [7] чрезвычайно короткое, автор полагается на здравый смысл и интуицию читателя.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon rev 2013] CASE
« Ответ #19 : Ноябрь 08, 2013, 10:27:36 am »
Также в отчете не сказано о том, что метки не могут пересекаться. Возможно, Никлаус Вирт действительно невнимательно отредактировал отчет, такое с ним случалось и прежде.
Посмотрел репорт 2013 года, - и правда, - нигде не сказано, что метки выбора не должны дублироваться. И всё же я думаю, что если задать Вирту прямой вопрос, то он ответит: "Конечно, не могут дублироваться".
Как писал Патрик:
Цитата: Patrik Reali
Оригинальное сообщение о языке [7] чрезвычайно короткое, автор полагается на здравый смысл и интуицию читателя.
Это там еще с 2007 года.

А вот в 1990 году:
Цитировать
The case expression and all labels must be of the same type, which must be an integer type or CHAR. Case labels are constants, and no value must occur more than once. If the value of the expression does not occur as a label of any case, the statement sequence following the symbol ELSE is selected, if there is one. Otherwise it is considered as an error.

То есть все привыкли именно вот так CASE в языках Оберон-семейства трактовать (ну, быть может за вычетом ELSE). Но Вирт то вот это все явно удалил. И быть может не просто так? :-)

Надо бы как-то на Вирта таки выйти.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: [Oberon rev 2013] CASE
« Ответ #20 : Ноябрь 10, 2013, 09:45:48 am »
Ну, с другой стороны про IF-statement сказано, что:
Цитировать
If no guard is satisfied, the statement sequence following the symbol ELSE is executed, if there is one
А что делать если ELSE нет, также не сказано. Может трап должен быть, а может и нет.
Трапа, конечно же, быть не должно. Иначе, конструкция IF просто перестаёт быть конструкцией ветвления: единственный вариант, который обязательно должен быть выполнен. Но перед началом выполнения должно выполняться какое-то условие. Это же просто ASSERT!

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon rev 2013] CASE
« Ответ #21 : Ноябрь 10, 2013, 11:30:14 am »
Ну, с другой стороны про IF-statement сказано, что:
Цитировать
If no guard is satisfied, the statement sequence following the symbol ELSE is executed, if there is one
А что делать если ELSE нет, также не сказано. Может трап должен быть, а может и нет.
Трапа, конечно же, быть не должно. Иначе, конструкция IF просто перестаёт быть конструкцией ветвления: единственный вариант, который обязательно должен быть выполнен. Но перед началом выполнения должно выполняться какое-то условие. Это же просто ASSERT!
Да нет, не перестает. Просто ELSE или ELIF становится обязательным.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [Oberon rev 2013] CASE
« Ответ #22 : Ноябрь 10, 2013, 12:11:46 pm »
Только ELSE  ;)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon rev 2013] CASE
« Ответ #23 : Ноябрь 10, 2013, 12:27:08 pm »
Только ELSE  ;)
Почему? У тебя может быть ситуация, когда у тебя есть две (или более) ветки, а ELSE не возможен в принципе по логике работы программы. И вот там то и нужен HALT :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: [Oberon rev 2013] CASE
« Ответ #24 : Ноябрь 10, 2013, 12:39:47 pm »
Да нет, не перестает. Просто ELSE или ELIF становится обязательным.
И, согласно текущему определению языка, как минимум один оператор, бессмысленный и беспощадный. А ведь есть банальный ASSERT.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [Oberon rev 2013] CASE
« Ответ #25 : Ноябрь 10, 2013, 01:21:59 pm »
Только ELSE  ;)
Почему? У тебя может быть ситуация, когда у тебя есть две (или более) ветки, а ELSE не возможен в принципе по логике работы программы. И вот там то и нужен HALT :-)
Ничего не понял. Как ELIF может быть обязательным?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [Oberon rev 2013] CASE
« Ответ #26 : Ноябрь 14, 2013, 07:37:51 pm »
Нет, в принципе конечно идея сделать жесткой конструкцию IF ELIF ELSE (то есть ELSE обязателен) равно как и CASE .. ELSE, довольно интересна. В этом случае будут рассматриваться гарантированно все случаи, все ветки всегда. И вообще лежит в том же русле что и RETURN не как statement, а как часть синтаксиса функции.

Но Вирт по какой-то причине этого не сделал.
Мне иногда кажется что мы вавилонскую башню строим. Т.к. разговариваем бывает на разных языках.
 :)
Вот эта цитата примечательна тем, что предлагается вариант который имеет полностью противоположный эффект, нежели дает CASE с HALT.
HALT - дает гарантию что выполнение остановится если CASE'у сообщение неизвестно. Т.е. весь профит заключен именно в останове.
Предложенный же тобой вариант, в корне этот профит уничтожает.

И этот вариант как раз никогда не гарантирует что:
Цитировать
будут рассматриваться гарантированно все случаи, все ветки всегда.

Пример:
if msg = m1 then
   do1();
elif msg = m2 then
   do2();
else
   do3();
end;
Даем конструкции новую мессагу m4 и приехали... Кот работает как ни в чем не бывало. И только по побочным эффектам от багов можно будет догадаться, что забыл добавить обработку этой новой мессаги.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [Oberon rev 2013] CASE
« Ответ #27 : Декабрь 01, 2013, 09:24:17 pm »
Судя по информации из PO2013 и исходникам, новый CASE теперь аналог WITH в CP.
При этом он не имеет ELSE. И, похоже, что valexey был прав насчет HALT..., ибо в исходниках я не обнаружил генерацию оного.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: [Oberon rev 2013] CASE
« Ответ #28 : Декабрь 02, 2013, 01:50:07 pm »
То есть, будет трап, если условие не удовлетворено?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [Oberon rev 2013] CASE
« Ответ #29 : Декабрь 02, 2013, 01:52:31 pm »
Наоборот. Трапа не будет.