«Геттер и сеттер -- это фиговый синтаксический сахар, потому что вызываемая функция должна знать, что ей передали выражение, к которому нужно применять геттер. А хотелось бы, чтобы ей казалось, что ей передали выражение, к которому уже применили геттер :-)»
Не представляю синтаксис для этой цели, кроме того, который я приводил выше: перем @ [Геттер образец] что эквивалентно приписыванию условия , <Геттер перем> : образец Если просто в образце написать [Геттер образец] то мы потеряем возможность обращаться к исходному («сырому») значению в правой части. Для симметрии для обновления значения в правой части можно использовать аналогичный синтаксис перем @ [Сеттер результат] но он ничем не лучше простого вызова функции <Сеттер перем результат> Можно вместо тип.индекс @ [Геттер образец] писать [Геттер образец].индекс /* тип описывается в определении геттера */ или тип[Геттер образец]индекс (скобки могут быть любыми) или Геттер.индекс @ [образец] (тоже скобки не обязательно квадратные). Можно пойти по пути Refal’а-D, который я тут пересказывать не буду, ограничусь ссылкой и скриншотом: http://refal.botik.ru/library/refal2015_issue-II.pdf (стр. 97) Но путь Рефала-Д мне не нравится. Другие варианты синтаксиса для этой цели мне не очевидны. Мы хотим увидеть в выражении другое выражение. Хотим увидеть = хотим сопоставить с образцом. Способ видения (геттер, линза) должен указываться явно, т.к. Рефал динамически типизированный. Подобразец нужно отграничить от остального образца. Поэтому у нас в записи должны появиться скобки, имя линзы и подобразец внутри скобок. Также полезно иметь возможность обратиться к исходному значению (но это опционально). Отсюда и получаются записи вида 1) [Геттер образец] 2) перем @ [Геттер образец] Тут можно варьировать синтаксические детали: вид скобок (круглые, квадратные, фигурные, угловые…), разделитель (я указал традиционную для ФЯ собачку, но можно и любой другой знак или вообще ничего не указывать) и взаимный порядок расположения элементов. Ничего другого мне в голову не приходит. В этой нотации можно определить тождественный геттер и благодаря нему иметь возможность обращаться и к подвыражению целиком (чтобы целиком его использовать в результате), и к его частям: (e.Name) e.Table @ [AsIs e.1 (e.Name t.Value) e.2] = <F e.Table> <G t.Value>; что будет эквивалентно (e.Name) e.Table , e.Table : e.1 (e.Name t.Value) e.2 = <F e.Table> <G t.Value>; Случай тождественной линзы на практике будет распространённым, для него можно ввести сокращённую запись, например `перем @ [= образец]`. С уважением, Александр Коновалов
