OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 10 Август, 2020 22:12

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: #036 Тупик интерфейса DevMarkers?
СообщениеДобавлено: Воскресенье, 24 Май, 2020 19:29 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 275
Коллеги,

потребовалось мне сделать маркеры ошибок, но эдакие. Взялся я уточнять тип DevMarkers.View. И вот зашел в тупик:

DevMarkers.View = POINTER TO ABSTRACT RECORD
mode-: INTEGER
END;

MyMarkers.View = POINTER TO RECORD (DevMarkers.View) ... END;

PROCEDURE (v: View) CopyFromSimpleView (source: Views.View); (* тупик тут *)
BEGIN
v.mode := source(View).mode (* так нельзя, ессно *)
v.CopyFromSimpleView^(source)
(* так тоже нельзя, потому что CopyFromSimpleView отмечена "-" - т.е. вызывать нельзя *)
END CopyFromSimpleView;

Есть, конечно, DevMarkers.View.InitErr, .SetMode и т.п., но они не подходят для создания дубликата, поскольку у них есть побочные эффекты.

Вопрос: как я понимаю, это упущение авторов интерфейса DevMarkers? Надо было им предусмотреть CopyFromSimpleView2-, как, например, в Controls.Control?

И еще вопрос: как-то же называется этот паттерн, и где-то же он описан; подскажите, пож, как и где?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тупик интерфейса DevMarkers?
СообщениеДобавлено: Воскресенье, 24 Май, 2020 19:39 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 275
И еще про DevMarkers: они предусмотрели возможность расширениям иметь не два, а больше режимов (которые определяются полем .mode); На эту возможность указывает код в разных местах и именованные константы. Но в процедуре .SetMode эту возможность уничтожили:

Код:
PROCEDURE (v: View) SetMode* (mode: INTEGER), NEW, EXTENSIBLE;
BEGIN
   ASSERT((firstMode <= mode) & (mode <= lastMode), 20);
...


Полагаю, это они ошиблись. Нужно либо выкинуть второй конъюнкт, либо, если нужно все-таки проверять верхнюю границу, сделать как-то так:
Код:
PROCEDURE (v: View) LastMode (): INTEGER, NEW, ABSTRACT;
PROCEDURE (v: View) SetMode* (mode: INTEGER), NEW, EXTENSIBLE;
BEGIN
   ASSERT((firstMode <= mode) & (mode <= v.LastMode()), 20);
...


Предлагаю либо выкинуть проверку, либо добавить .LastMode.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #036 Тупик интерфейса DevMarkers?
СообщениеДобавлено: Понедельник, 06 Июль, 2020 10:20 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2810
Правка внесена в ветку dev18


Код:
diff --git a/BlackBox/Dev/Mod/Markers.odc b/BlackBox/Dev/Mod/Markers.odc
index b98c563..8125e77 100644
--- a/BlackBox/Dev/Mod/Markers.odc
+++ b/BlackBox/Dev/Mod/Markers.odc
@@ -11,6 +11,7 @@ MODULE DevMarkers;
        - 20070301, bh, helper strings enlarged to 1024 characters
        - 20161216, center #144, inconsistent docu and usage of Files.Locator error codes
        - 20170215, center #139, localization support for error messages
+       -20200605, adimetrius, introduce View.CopyFromSimpleView2 to really enable extensions https://forum.oberoncore.ru/viewtopic.php?f=29&t=6621
        ##<="
        issues  = "##=>
 
@@ -63,6 +64,8 @@ MODULE DevMarkers;
 
 
        (** View **)
+       
+       PROCEDURE (v: View) CopyFromSimpleView2- (source: View), NEW, EMPTY;
 
        PROCEDURE (v: View) CopyFromSimpleView- (source: Views.View), EXTENSIBLE;
        BEGIN
@@ -71,7 +74,8 @@ MODULE DevMarkers;
                        v.err := source.err; v.mode := source.mode;
                        IF source.msg # NIL THEN
                                NEW(v.msg, LEN(source.msg^)); v.msg^ := source.msg^$
-                       END
+                       END;
+                       v.CopyFromSimpleView2(source)
                END
        END CopyFromSimpleView;
 
@@ -103,7 +107,7 @@ MODULE DevMarkers;
        PROCEDURE (v: View) SetMode* (mode: INTEGER), NEW, EXTENSIBLE;
                VAR op: SetModeOp;
        BEGIN
-               ASSERT((firstMode <= mode) & (mode <= lastMode), 20);
+               ASSERT((firstMode <= mode) (*& (mode <= lastMode)*), 20);
                IF v.mode # mode THEN
                        NEW(op); op.view := v; op.mode := mode;
                        Views.Do(v, "#System:ViewSetting", op)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #036 Тупик интерфейса DevMarkers?
СообщениеДобавлено: Вторник, 07 Июль, 2020 06:13 

Зарегистрирован: Суббота, 04 Май, 2019 10:21
Сообщения: 18
without change this module, extending the type View is no problem;
the three modes is the interface(intent) of design;the SetMode should not break it;

e.g.
Код:
MODULE ObxMarkers;
   IMPORT DevMarkers, Views, Stores, Ports;
   (* https://forum.oberoncore.ru/viewtopic.php?f=29&t=6621  *)
   TYPE
      View = POINTER TO RECORD (DevMarkers.View)
         x: INTEGER;
      END;
      
 
   PROCEDURE (v: View) CopyFromSimpleView- (source: Views.View);
   BEGIN
      (* v.CopyFrom^(source); *)
      WITH source: View DO
         v.CopyFromSimpleView^(source);
         v.x := source.x;
      END
   END CopyFromSimpleView;
   
   
   PROCEDURE (v: View) SetMode (mode: INTEGER);
   BEGIN
      IF mode = DevMarkers.mark THEN
         v.x:=1;
      ELSIF mode = DevMarkers.message THEN
         v.x:=2;
      END;
      v.SetMode^(mode);
   END SetMode;

   PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);
      VAR c: Views.Context; w, h: INTEGER;
      CONST point = Ports.point;
   BEGIN
      c := v.context; c.GetSize(w, h);
      f.DrawRect(point, 0, w - point, h, point, Ports.red);
   END Restore;
      
      
   PROCEDURE Deposit* ;
      VAR v: View;
   BEGIN
      NEW(v); v.x := 3; Views.Deposit(v)
   END Deposit;



END ObxMarkers.

"ObxMarkers.Deposit();StdCmds.Open()"
"ObxMarkers.Deposit();StdCmds.PasteView()"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #036 Тупик интерфейса DevMarkers?
СообщениеДобавлено: Вторник, 07 Июль, 2020 12:00 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 275
luowy писал(а):
without change this module, extending the type View is no problem;
the three modes is the interface(intent) of design;the SetMode should not break it;


Good point, CopyFromSimpleView can be implemented this way; although
Language Report писал(а):
Methods marked with " - " are "implement-only" exported. Such a method can be redefined in any importing module but can only be called within the module containing the method declaration. (Currently, the compiler also allows super calls to implement-only methods outside of their defining module. This is a temporary feature to make migration easier

So yes, CP2 compiler that is part of BlackBox supports super-calls to implement-only method; however, it is not a language feature, but a compiler peculiarity. The migration they are referring to here is the introduction of CopyFromSimpleView2, like was done in other framework types. I guess the original authors haven't completed the migration.

And as far as allowing for more than just two modes - well, I think it is so convenient to have markers support various modes... A lot of temporary informational views could be implemented based on this interface. Like marking all occurences of a variable in source text, or marking all branches of an IF in a large procedure. In a project I'm doing I implemented error messages with additional subcodes


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #036 Тупик интерфейса DevMarkers?
СообщениеДобавлено: Четверг, 16 Июль, 2020 15:17 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2810
Also found in language report, that it postulates super calls as obsolete. So it is better to have CopyFromSimpleView2.
Цитата:
It is recommended to minimize the use of procedure types and super calls, since they are considered obsolete. They are retained for the time being, in order to simplify the use of existing Oberon-2 code. Support for these features may be reduced in later product releases.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

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


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

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


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

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