OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 178 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9  След.
Автор Сообщение
СообщениеДобавлено: Пятница, 24 Октябрь, 2008 17:39 
Аватара пользователя

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

Нельзя ли чуть развить в соотв. теме?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Октябрь, 2008 17:45 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Info21 писал(а):
AVC писал(а):
Этот маленький язык - большая ошибка. :evil:

Нельзя ли чуть развить в соотв. теме?
Попробую.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Октябрь, 2008 20:14 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1449
Откуда: Киев
slava писал(а):
Далее мне все равно не понятно, а кто будет делать CLOSE секции CLOSE ? И кто будет ловить exceptions в секции CLOSE ?
Ах да! В секции CLOSE будет очень простой код, чистый от багов и исключительных ситуаций!

Нет необходимости обрабатывать exception в секции close. Приложение не обязано обрабатывать все возможные исключения. Оно должно обрабатывать лишь те из них, при которых можно сохранить основную логику программы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 15:16 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
AVC писал(а):
4. Процедурные секции CLOSE (по аналогии с модулем) и их привязка к обработке исключения.
Можно ввести секции в язык процедурные секции CLOSE (аналог finally) и поручить обработчику трапов их вызвать (в порядке LIFO, разумеется)
Кажется PushTrapCleaner/PopTrapCleaner позволяют сделать такую секцию. http://wiki.oberoncore.ru/index.php/BlackBox:Kernel


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 17:24 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Евгений Темиргалеев писал(а):
http://wiki.oberoncore.ru/index.php/BlackBox:Kernel
Кстати, добавил туда описание HALT (128).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 17:37 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Интересно - не знал про этот код...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 17:41 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Не хочу читать весь топик, может здесь где то проскакивало.
В AO есть секция FINALY:
http://a2os.org.ua/forums/topic.php?forum=4&topic=3


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 18:36 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Илья Ермаков писал(а):
Интересно - не знал про этот код...
Да, есть такая строчка в Kernel.TrapHandler:
IF err = 128 THEN (* do nothing *)
ELSIF...
Я использовал это в системе автоматического тестирования задач для прерывания зависшего теста по таймеру.


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
bohdant писал(а):
Не хочу читать весь топик, может здесь где то проскакивало.
В AO есть секция FINALY:
http://a2os.org.ua/forums/topic.php?forum=4&topic=3
А вот у нас некоторые утверждают, что секция CLOSE (она же FINALLY в AO) не нужна... :roll:


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

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
AVC писал(а):
А вот у нас некоторые утверждают, что секция CLOSE (она же FINALLY в AO) не нужна... :roll:

Как говорил:
Info21 писал(а):
Наоборот. Нужны веские доводы, чтобы *включать* что-то в язык. Пока таких не предъявлено, по умолчанию -- не включать.

Вывод: Значит нашлись веские доводы :lol:
Кстати они нашлись уже давно, когда именно не знаю но уже в версии 3.5.2005 version 2.00 alpha писалось:
Цитата:
- exception handling is now compatible to bluebottle and handles FINALLY statements (see Win32.AosTrap.Mod)


В Аос только несколько раз(~10) встречается данная секция.
Кстати хотел спросить: как там с открытыми файлами без секции FINALLY получается?


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
bohdant писал(а):
AVC писал(а):
А вот у нас некоторые утверждают, что секция CLOSE (она же FINALLY в AO) не нужна... :roll:

Как говорил:
Info21 писал(а):
Наоборот. Нужны веские доводы, чтобы *включать* что-то в язык. Пока таких не предъявлено, по умолчанию -- не включать.

Вывод: Значит нашлись веские доводы :lol:


Может, тема нужна была тема для дисера али диплома... :-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2008 04:29 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Илья Ермаков писал(а):
bohdant писал(а):
AVC писал(а):
А вот у нас некоторые утверждают, что секция CLOSE (она же FINALLY в AO) не нужна... :roll:

Как говорил:
Info21 писал(а):
Наоборот. Нужны веские доводы, чтобы *включать* что-то в язык. Пока таких не предъявлено, по умолчанию -- не включать.

Вывод: Значит нашлись веские доводы :lol:


Может, тема нужна была тема для дисера али диплома... :-)
Всё-таки без CLOSE (FINALLY) не очень удобно.
В качестве временной меры можно предложить функцию Trap, принимающую в качестве параметра процедуру (насчёт праметров можно уточнить) и возвращающую TRUE, если случилось исключение.
Код:
MODULE TrapHandler;

   IMPORT SYSTEM, Kernel;
   
   PROCEDURE Handler(a, b, c: INTEGER);
      TYPE PROC = PROCEDURE;
      VAR p: PROC;
   BEGIN p := SYSTEM.VAL(PROC, a);
      p
   END Handler;
   
   PROCEDURE Trap* (p: PROCEDURE) : BOOLEAN;
      VAR count: INTEGER;
   BEGIN
      count := Kernel.trapCount;
      Kernel.Try(Handler, SYSTEM.VAL(INTEGER, p), 0, 0);
      RETURN count # Kernel.trapCount;
   END Trap;

END TrapHandler.
Использовать её можно примерно так:
Код:
   PROCEDURE Foo;
      VAR x: REAL; n: INTEGER;
   BEGIN
      x := 0.0; n := SHORT(ENTIER(1.0 / x));
   END Foo;
   
   PROCEDURE TryTest* ;
   BEGIN
      IF TrapHandler.Trap(Foo) THEN (* это "EXCEPT" *)
         Log.String("trap occured"); Log.Ln;
      END;
      (* а здесь может разместиться "FINALLY" *)
      Log.String("but we are still alive :)"); Log.Ln;
   END TryTest;
Конечно, вариант не идеальный... :roll:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2008 05:03 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
AVC писал(а):
<...> насчёт праметров можно уточнить <...>
Например, параметры можно передавать через расширяемую запись, как в программной шине.
Тогда процедура, передаваемая в Trap, будет как бы обработчиком сообщения.
Уточнённый вариант может выглядеть так:
Код:
MODULE TrapHandler;

   IMPORT SYSTEM, Kernel;
   
   TYPE Message* = EXTENSIBLE RECORD END;
      Proc* = PROCEDURE (VAR m: Message);
   
   PROCEDURE Handler(a, b, c: INTEGER);
      TYPE M = POINTER TO Message;
      VAR p: Proc;
   BEGIN p := SYSTEM.VAL(Proc, a);
      p(SYSTEM.VAL(M, b))
   END Handler;
   
   PROCEDURE Trap* (p: Proc; VAR m: Message) : BOOLEAN;
      VAR count: INTEGER;
   BEGIN
      count := Kernel.trapCount;
      Kernel.Try(Handler, SYSTEM.VAL(INTEGER, p), SYSTEM.ADR(m), 0);
      RETURN count # Kernel.trapCount;
   END Trap;

END TrapHandler.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2008 06:57 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Итак, в XDS есть секции CLOSE и EXCEPTION, в GPCP есть секция RESCUE, в A2 тоже что-то есть. Получается, что нужно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2008 07:43 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Axcel писал(а):
Итак, в XDS есть секции CLOSE и EXCEPTION, в GPCP есть секция RESCUE, в A2 тоже что-то есть. Получается, что нужно.

Причём если бы это было изначально сделано ещё Виртом в первом Обероне, то сейчас не было бы такого зоопарка расширений -- где-то CLOSE, где-то RESCUE, где-то FINALLY...
Переносимость программ была бы выше...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2008 09:28 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Илья Ермаков писал(а):
Может, тема нужна была тема для дисера али диплома... :-)

Возможно, но тогда скорее всего бы была какая то библиотечка с кучей трапов и FINALLY.
А так скорее подумали, что все таки нужно. Возможно нужно в "закрытых" проектах.

Может пару беспилотников упали из-за отсутствия данной секции? :lol:

приведу пример использования:
Код:
      PROCEDURE SafelyDoOperation() : BOOLEAN;
      VAR trap, opened : BOOLEAN; res : LONGINT; temp: ARRAY 256 OF CHAR;
      BEGIN
         trap := FALSE; opened := FALSE;
         IF (disk.device # NIL) THEN
            disk.device.Open(res);
            IF res = AosDisks.Ok THEN
               opened := TRUE;
               DoOperation;
            ELSE
               GetErrorMsg("Could not open device: ", res, temp); ReportError(temp);
            END;
         ELSE
            ReportError("Could not open device: No device exists");
         END;
      FINALLY
         IF opened & (disk.device # NIL) THEN
            disk.device.Close(res);
            IF res # AosDisks.Ok THEN
               GetErrorMsg("Could not close device: ", res, temp); ReportError(temp);
            END;
         END;
         RETURN trap;
      END SafelyDoOperation;


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

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Axcel писал(а):
Итак, в XDS есть секции CLOSE и EXCEPTION, в GPCP есть секция RESCUE, в A2 тоже что-то есть. Получается, что нужно.
Ага. В ББ есть Kernel.PushTrapCleaner В ББ и Kernel.Try. Что же Вам еще нужно?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2008 11:26 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Илья Ермаков писал(а):
Может, тема нужна была тема для дисера али диплома... :-)
Я так не думаю, это не "веский" довод :roll: Всё же секция CLOSE действительно вещь полезная. Если её оформить в виде процедуры (как альтернатива), то приходилось бы беспокоится о том, чтобы вовремя её вызвать при выгрузке модуля. А можно и вообще забыть её вызвать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2008 12:00 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Евгений Темиргалеев писал(а):
Axcel писал(а):
Итак, в XDS есть секции CLOSE и EXCEPTION, в GPCP есть секция RESCUE, в A2 тоже что-то есть. Получается, что нужно.
Ага. В ББ есть Kernel.PushTrapCleaner В ББ и Kernel.Try. Что же Вам еще нужно?
Для реализации (под Windows) большего, наверное, и не надо.
Но есть "интерфейсные" недостатки.
1. Потребуется несколько исключительно "технических" (реализационных) вызовов, а для PushTrapCleaner ещё надо будет завести класс, производный от Kernel.TrapCleaner.
Это усложнит как понимание, так и реализацию обработки особых состояний. Это решение и неочевидно, и недостаточно документировано. Я вот сейчас знаю, как это сделать, а ещё недавно - не знал.
2. Реализация Kernel - системно зависима. Отсюда, насколько я понимаю, и три аргумента у обработчика, переаваемого в Kernel.Try. А если будем писать на КП для других платформ (что не так уж невероятно)?
3. Лучше иметь один стандартный вариант, чем "зоопарк" разных решений. Здесь я согласен с Geniepro.


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

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Geniepro писал(а):
Axcel писал(а):
Итак, в XDS есть секции CLOSE и EXCEPTION, в GPCP есть секция RESCUE, в A2 тоже что-то есть. Получается, что нужно.

Причём если бы это было изначально сделано ещё Виртом в первом Обероне, то сейчас не было бы такого зоопарка расширений -- где-то CLOSE, где-то RESCUE, где-то FINALLY...
Переносимость программ была бы выше...
Гм.. а что ещё ему надо было сделать в первом Обероне, чтобы вообще не было зоопарка XDS, GPCP, A2 и проч? Тогда бы вопрос о переносимости вообще не стоял.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 178 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9  След.

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


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

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


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

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