OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 07:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 57 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Суббота, 31 Май, 2008 21:29 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
AVC писал(а):
WHILE m > n DO m := m – n
ELSIF n > m DO n := n – m
END

Вот этот вот ELSIF внутри WHILE а не IF мне лично кажется глубоко неверным и провоцирующим ошибки. Неужели так трудно было ввести ещё одно ключевое слово?..


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 31 Май, 2008 21:35 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Geniepro писал(а):
Вот этот вот ELSIF внутри WHILE а не IF мне лично кажется глубоко неверным и провоцирующим ошибки. Неужели так трудно было ввести ещё одно ключевое слово?..
Это Дейкстре было легко с ключевыми словами: он, кажется, там просто квадратики рисовал... :)
Возможно, заслуживал внимания вариант с разделителем '|', как в CASE и "ветвистом" операторе WITH из О-2.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 31 Май, 2008 21:49 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
AVC писал(а):
А как это может выглядеть на практике?
Я придумал с семафорчиками:
Код:
do1 := TRUE; do2 := FALSE;
WHILE do1 DO do1 := FALSE; (* сброс флага лучше делать сразу же *)
   куча кода;
   do2 := ~(что-то там) (* достаточно очевидное разрешение пойти на вторую ветку цикла *)
ELSIF do2 DO do2 := FALSE;
   еще куча кода;
   do1 := TRUE (* безусловно идём на первую ветку *)
END;
тоже не сижу сложа руки
А вообще в таком случае я обычно делаю процедуры heap1, heap2 и дальше по накатанной схеме:
Код:
heap1;
WHILE ~(что-то там) DO
   heap2;
   heap1
END;
тоже не сижу сложа руки (* да, этот хитрый код выполняется после цикла *)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 31 Май, 2008 22:07 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Более общий случай - finite state machine:
Код:
state := 0; (* < 0 - конец цикла *)
REPEAT
   CASE state OF
   | 0:
      куча кода;
      IF что-то там THEN
         тоже не сижу сложа руки;
         state := -1 (* EXIT *)
      ELSE
         state := 1
      END
   | 1:
      ещё куча кода;
      state := 0
   ELSE
   END
UNTIL state < 0;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 31 Май, 2008 22:10 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Александр Ильин писал(а):
Я придумал с семафорчиками:
Насколько я помню баталии на RSDN, от вариантов с семафорчиками вся прогрессивная общественность сразу приходит в бешенство.
Считает их противоестественными, что-ли...
Александр Ильин писал(а):
А вообще в таком случае я обычно делаю процедуры heap1, heap2 и дальше по накатанной схеме:
Я тоже иногда так делаю.
И это одна из причин, почему я "горой" за вложенные процедуры. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 31 Май, 2008 22:28 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
AVC писал(а):
от вариантов с семафорчиками вся прогрессивная общественность сразу приходит в бешенство.
Считает их противоестественными, что-ли...


Заводить дополнительный стэйт (в то время как прогрессивная общественность пытается максимально минимизировать его) только для того, чтобы направить поток выполнения в нужное русло - это действительно противоестественно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 31 Май, 2008 23:01 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
(Да, вот если посмотреть глобально, то чертёж (Дракон) позволяет гораздо выразительнее показывать стейты без лишних переменных и проверок, чем текстовое программирование. По горизонтали идёт разделение по разным вариантам-ситуациям, не нужно вводить доп. параметры).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июнь, 2008 00:06 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
AVC писал(а):
... А как это может выглядеть на практике?
Допустим, у меня есть типичный LOOP:
LOOP
    куча кода;
    IF что-то там THEN тоже не сижу сложа руки; EXIT END;
    еще куча кода
END

Главное здесь то, что "что-то там" проверяется в середине цикла.

Во-первых, "тоже не сижу сложа руки" -- это обработка окончания цикла. Если ее вынести из цикла, то к простейшему WHILE, вроде, приводится легко.

А LOOP как раз и становится оптимизацией этого WHILE.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июнь, 2008 00:37 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Ну, не знаю, мне кажется, что WHILE красиво выглядит только в простых случаях, в смысле когда в теле цикла простой код. Когда же там "куча кода", предпочитаю LOOP. Так "честнее".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июнь, 2008 02:51 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Info21 писал(а):
AVC писал(а):
... А как это может выглядеть на практике?
Допустим, у меня есть типичный LOOP:
LOOP
    куча кода;
    IF что-то там THEN тоже не сижу сложа руки; EXIT END;
    еще куча кода
END

Главное здесь то, что "что-то там" проверяется в середине цикла.

Во-первых, "тоже не сижу сложа руки" -- это обработка окончания цикла. Если ее вынести из цикла, то к простейшему WHILE, вроде, приводится легко.

С учетом всего сказанного, цикл WHILE получается примерно таким:
куча кода;
WHILE ~что-то там DO
    еще куча кода;
    куча кода
END;
тоже не сижу сложа руки

Можно сказать, элегантно: обошлись без "ненавистных" семафорчиков. :)
Но возникла некоторая проблема: "куча кода" дублируется. Такой проблемы не было в первоначальном коде.
(Возможно, стоит отметить, что дублирование кода считается нынче смертным грехом. :evil: )
Имеет смысл вынести часть "куча кода" в процедуру (вложенную, т.к. в процедуру выносится просто кусок реализации основной процедуры. Обычное дело. Без всяких там predominantly functional style). Это второй из вариантов, приведенных Александром Ильиным.
Есть ли лучшее решение?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июнь, 2008 09:03 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
AVC писал(а):
Но возникла некоторая проблема: "куча кода" дублируется. Такой проблемы не было в первоначальном коде. ...


1) Для этого процедуры и существуют.

2) Нужно еще доказать, что ситуация, когда там действительно дублируется "куча кода", является достаточно частой на практике. Но как раз это не очевидно. Чаще там инициализация, которую яснее представлять именно как инициализацию.

3) Есть проблема верификации.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июнь, 2008 09:06 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
AVC писал(а):
Есть ли лучшее решение?

Удалиться на месяц в глушь без мобильника, интернета и компа с одной книжкой Дейкстры.
(Можно и Гриса, но там так разжевывается, что утомительно продираться сквозь ... слюну).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июнь, 2008 12:43 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
AVC писал(а):
Есть ли лучшее решение?
Первое, что приходит в голову, -- объединить "кучу кода" и проверку "что-то там" в одну вложенную функцию ЧтоТоТам(). :)
WHILE ~ЧтоТоТам() DO
    еще куча кода
END;
тоже не сижу сложа руки

Не знаю, можно ли считать это улучшением? По-крайней мере, номинально дублирования больше нет. Но в Обероне-07 (теоретически) могут возникнуть (непредвиденные) неудобства с использованием RETURN (во вложенной функции).
Допустим, мы разобрались с данным конкретным случаем LOOP. С другой стороны, это был простейший случай... Я бы пока LOOP оставил в языке.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июнь, 2008 13:37 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
AVC писал(а):
... Я бы пока LOOP оставил в языке.

Точно так же и Вирт рассуждал в 1988 г. :-)
Просто он и его "школьники" об этом с тех пор думали, а мы тут -- не особо :-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июнь, 2008 13:53 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Info21 писал(а):
Точно так же и Вирт рассуждал в 1988 г. :-)
Просто он и его "школьники" об этом с тех пор думали, а мы тут -- не особо :-)
В то время Вирт публиковал свои размышления (у него была где-то статья, содержащая в частности разбор плюсов и минусов LOOP).
А сейчас он ограничился тривиальным примером с алгоритмом Евклида, никак не покрывающим область применения LOOP...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июнь, 2008 13:56 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
AVC писал(а):
Вирт публиковал свои размышления...
Можно статейку? Или хотя бы название, чтобы самому поискать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июнь, 2008 14:43 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Александр Ильин писал(а):
AVC писал(а):
Вирт публиковал свои размышления...
Можно статейку? Или хотя бы название, чтобы самому поискать?
Сразу, наверное, не вспомню. :(
Статейка относилась примерно ко времени создания Модула-2.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 02 Июнь, 2008 12:14 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Для Geniepro: Я не считаю, что нарушение слишком злостное, чтобы вас отключать, но вам запрещается писать что-либо на форуме (кроме личных сообщений) до 8 июня 2008г. включительно. Всё общение со мной - личными сообщениями. При нарушении данного предписания, я отключу учётную запись.

Сообщения удалены в Архив.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 03 Июнь, 2008 14:10 

Зарегистрирован: Понедельник, 02 Июнь, 2008 19:35
Сообщения: 305
Извините за дилетанский вопрос.
Будут какие то внесены изменения в Оберон в рамках Rosa-R
в свете изменений в Обероне-07 (как я понял исключение из языка указателей на массивы не есть хорошо и непонятно чем обосновано), а также устройство и работа с классами.
Хоть я и дилетант, но мне тем не менее показались слова Зуева обоснованы на счет неполноценности организации ОПП в Обероне
Цитата:
Зуев:
Оберон: одноранговый набор модулей-«синглтонов» (то есть, каждый модуль присутствует в работающей программе в единственном числе). Каждый модуль может хранить собственное состояние (контекст). "Активные" компоненты модуля - процедуры. Гораздо лучше, чем в Си, никто не спорит. Но вот достаточно ли простого набора одинаковых сущностей (и опять, как и в Си, ЛИНЕЙНОГО), чтобы адекватно отражать многообразные отношения между частями создаваемой системы? Тем более, что, собственно, какой-либо ассортимент этих сущностей отсутствует: есть только модули.
...расширяемые записи (аналог классов в более распространенных языках) не являются средством структурирования программы в целом. Они существуют, по сути для того же, для чего предназначены были обычные записи: для представления данных. Добавились просто более продвинутые средства организации работы с этими данными и средства наращивания этой функциональности. Для целей организации программы служат те же модули, и только они. Записи остаются сущностями "второго сорта" - их можно экспортировать в другие модули и там расширять, но это не меняет общей ситуации: "объектные" записи всегда заключены внутри модулей и, тем самым, никак не помогают строить программу.
(Вообще, у меня создалось отчетливое ощущение, что и автор Оберона, и авторы Ады не разделяли тогдашние некритические восторги по поводу ООП и расширили свои языки не по внутреннему убеждению в важности и необходимости новых средств, а, скорее, против собственного желания, подчиняясь общей тенденции. Неудобство ООП в этих языках - прямое следствие и такой "вынужденности" тоже).

Упрощение вещь хорошая, но если грубо говоря умножение заменить сложением теоретически вполне и возможно, но для практики это будет совсем неудобно. Когда-то упрощения необходимо и остановить. Вирт конечно имеет огромный и заслуженный авторитет, но в данном случае может стоит применить поговорку Аристотеля "Платон мне друг, но истина дороже." и доработать Оберон в рамках Rosa-R?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 03 Июнь, 2008 15:12 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
AVC писал(а):
В Обероне-07 отказ от очевидно полезных конструкций (таких как цикл LOOP или указатели на массивы).


Кстати, а что такого страшного в отсутствии указателей на массив? Я даже могу придумать вполне разумную причину для такого решения (помимо пресловутого упрощения компилятора). Стремление поднять уровень кода за счет вынужденного отказа от таких низкоуровневых сущностей как массив в пользу более высокоуровневых (именованных и расширяемых) сущностей - записей.

P.S. Или я чего-то не так понял? :)
P.S.S. Ну а по поводу LOOP и прочих break все уже знают, что я думаю ;)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 57 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB