Василий Игоревич! «Если предлагаемое выражение длиннее уже имеющегося, зачем его вводить?» Новый синтаксис короче, т.к. разбираемая переменная упоминается только один раз. А для частного случая AsIs можно использовать более короткую запись `@ [: …] `. Можно сравнить длину: (e.Name) e.Table @ [: e.1 (e.Name t.Value) e.2] = … (e.Name) e.Table, e.Table : e.1 (e.Name t.Value) e.2 = … Новый вариант короче на 4 символа — длину слова «Table» минус 1. При другой расстановке пробелов, конечно, результат будет другим, но для более длинных имён выигрыш будет.
С уважением, Александр Коновалов Отправлено из Mailspring (https://getmailspring.com/), лучшего бесплатного приложения электронной почты On нояб. 14 2024, at 3:34 дня, Стеллецкий Василий sw710_AT_yandex.ru <[email protected]> wrote: > Ой, братцы, что-то я запутался > [ > В этой нотации можно определить тождественный геттер и благодаря нему иметь > возможность обращаться и к подвыражению целиком (чтобы целиком его > использовать в результате), и к его частям: > (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>; > ] > Если предлагаемое выражение длиннее уже имеющегося, зачем его вводить? > Извините. за ликбез. > > > > -- > С уважением, > > Василий > [email protected] > > > > ---------------- > 14.11.2024, 15:14, "Александр Коновалов a.v.konovalov87_AT_mail.ru" > <[email protected]>: > Кому: [email protected] ([email protected]); > Тема: Синтаксис словарей в Рефале!; > > > «Геттер и сеттер -- это фиговый синтаксический сахар, потому что вызываемая > > функция должна знать, что ей передали выражение, к которому нужно применять > > геттер. А хотелось бы, чтобы ей казалось, что ей передали выражение, к > > которому уже применили геттер :-)» > > > > Не представляю синтаксис для этой цели, кроме того, который я приводил выше: > > перем @ [Геттер образец] > > что эквивалентно приписыванию условия > > , <Геттер перем> : образец > > Если просто в образце написать > > [Геттер образец] > > то мы потеряем возможность обращаться к исходному («сырому») значению в > > правой части. > > > > Для симметрии для обновления значения в правой части можно использовать > > аналогичный синтаксис > > перем @ [Сеттер результат] > > но он ничем не лучше простого вызова функции > > <Сеттер перем результат> > > > > Можно вместо > > тип.индекс @ [Геттер образец] > > писать > > [Геттер образец].индекс /* тип описывается в определении геттера */ > > или > > тип[Геттер образец]индекс > > (скобки могут быть любыми) или > > Геттер.индекс @ [образец] > > (тоже скобки не обязательно квадратные). > > > > Можно пойти по пути 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>; > > Случай тождественной линзы на практике будет распространённым, для него > > можно ввести сокращённую запись, например `перем @ [= образец]`. > > > > С уважением, > > Александр Коновалов > > >
