Дмитрий Дагаев писал(а):
В качестве реализации инструментального подхода можно использовать Suite, как Вирт в Обероне
Код:
object.do.Method(object, params);
А зачем? Ведь передача object нужна была для передачи контекста, которого у tool просто нет. Или всё-таки есть? Не нужен и дополнительный контейнер процедур do, который был один для разных переменных этого типа, потому что tool и есть такой контейнер — один для всех. Если я всё правильно понял, то наиболее уместным было бы
Код:
object.Method(params)
Дмитрий Дагаев писал(а):
Разумеется, инструменты и функцию TOOL можно использовать в Обероне-07, если возникнет интерес (например, у разработчика компилятора Восток).
На мой взгляд, если воплощать такой подход(как я его понял) не как надстройку, а встраивать в язык, то можно было бы делать иначе. Если отталкиваться от того, что предложенная сущность — это не ограниченная запись с методами, а обобщение процедуры, то это могло бы увеличить ясность. Как вариант:
Код:
MODULE Log;
TYPE
T* = PROCEDURES
String (IN str: ARRAY OF CHAR);
Ln
END;
END Log.
MODULE NoLog; IMPORT Log;
PROCEDURE String (IN str: ARRAY OF CHAR); END String;
PROCEDURE Ln; END Ln;
PROCEDURES (Log.T) Do*;
.String = String;
.Ln = Ln;
END Do;
END NoLog.
MODULE Use; IMPORT Log, NoLog, SomeLog;
VAR log: Log.T;
string: PROCEDURE (IN str: ARRAY OF CHAR); ln: PROCEDURE;
PROCEDURE Go*;
BEGIN
log.String("И так можно"); log.Ln;
string("И эдак"); ln
END Go;
BEGIN
IF SomeLog.Supported
THEN log := SomeLog.Do
ELSE log := NoLog.Do
END;
string := log.String; ln := log.Ln
END Use.
С другой стороны, для меня это слишком частная сущность, чтобы добавлять её специальную поддержку.
Дмитрий Дагаев писал(а):
Персистентность обеспечивается самостоятельно, инструменты не имеют состояния (stateless).
Тогда интересно следующее — чем сохранение данных записи-объекта отличается от сохранения данных записи-параметра?