«Геттер и сеттер -- это фиговый синтаксический сахар, потому что вызываемая 
функция должна знать, что ей передали выражение, к которому нужно применять 
геттер. А хотелось бы, чтобы ей казалось, что ей передали выражение, к которому 
уже применили геттер :-)»

Не представляю синтаксис для этой цели, кроме того, который я приводил выше:
перем @ [Геттер образец]
что эквивалентно приписыванию условия
, <Геттер перем> : образец
Если просто в образце написать
[Геттер образец]
то мы потеряем возможность обращаться к исходному («сырому») значению в правой 
части.

Для симметрии для обновления значения в правой части можно использовать 
аналогичный синтаксис
перем @ [Сеттер результат]
но он ничем не лучше простого вызова функции
<Сеттер перем результат>

Можно вместо
тип.индекс @ [Геттер образец]
писать
[Геттер образец].индекс /* тип описывается в определении геттера */
или
тип[Геттер образец]индекс
(скобки могут быть любыми) или
Геттер.индекс @ [образец]
(тоже скобки не обязательно квадратные).

Можно пойти по пути 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>;
Случай тождественной линзы на практике будет распространённым, для него можно 
ввести сокращённую запись, например `перем @ [= образец]`.

С уважением,
Александр Коновалов
  • Re:... Sergei Skorobogatov s . yu . skorobogatov_AT_gmail . com
    • ... Стеллецкий Василий sw710_AT_yandex . ru
      • ... Sergei Skorobogatov s . yu . skorobogatov_AT_gmail . com
        • ... Стеллецкий Василий sw710_AT_yandex . ru
    • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
      • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Стеллецкий Василий sw710_AT_yandex . ru
      • ... Sergei Skorobogatov s . yu . skorobogatov_AT_gmail . com
        • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Sergei Skorobogatov s . yu . skorobogatov_AT_gmail . com
        • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Стеллецкий Василий sw710_AT_yandex . ru
        • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Стеллецкий Василий sw710_AT_yandex . ru
        • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Sergei Skorobogatov s . yu . skorobogatov_AT_gmail . com
        • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Sergei Skorobogatov s . yu . skorobogatov_AT_gmail . com
        • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Sergei Skorobogatov s . yu . skorobogatov_AT_gmail . com
        • ... Александр Коновалов a . v . konovalov87_AT_mail . ru

Ответить