Ответ Василию: Вызов <GETV sT> не "в левой части", мне следовало перед ним (после ...) поставить запятую, то есть это "левая часть условия". Да, последнее eL - это опечатка, надо: eR. Еще наверно следовало указать, что tK в образце - это повторная переменная (определенная где-то левее внутри ...), и тогда это поиск по ключу. Про sT я написал, что это "таблица", т.е. символ-ссылка на объект-таблицу. В целом здесь синтаксически ничего нового, чего нет в Рефале-6. С уважением, Аркадий
чт, 14 нояб. 2024 г. в 17:06, Стеллецкий Василий sw710_AT_yandex.ru < [email protected]>: > Мда, господа! Я уже четверть века не занимался "новыми" версиями рефала, > но тогда 25 лет назад, я их вроде читал и понимал... > [ > Рассмотрим, например, таблицу sT. Условимся, что ее содержимое - это > список термов-пар вида (tK eV), где tK - ключ, eV - значение. > Тогда можно было бы писать: > ... <GETV sT> : eL (tK eV) eR , ... = <SETV sT eL (t.K1 e.V1) eL> > ] > Т.е. GETV вызывается из левой части предложения с одним аргументом > СИМВОЛОМ (ну ладно, возможно ссылка, хотя такого не припомню) > Ну пусть она увидела eL (tK eV) eR [а как она узнала, что это нужный ей > tK?], НО ОТКУДА ВЗЯЛИСЬ (t.K1 e.V1) в правой части? > Ой, ребята, извините за ликбез, Но может кому тоже станет яснее... > ... Видимо последняя eL это eR... > > -- > С уважением, > Василий > [email protected] > > > > ---------------- > 14.11.2024, 16:14, "Стеллецкий Василий sw710_AT_yandex.ru" <[email protected] > >: > Кому: [email protected] ([email protected]); > Тема: Синтаксис словарей в Рефале!; > > > Александр Владимирович! > Т.е. выгода из-за длины идентификатора Table, а если вместо него > использовать T, - то выгоды никакой? > > -- > С уважением, > Василий > [email protected] > > > > ---------------- > 14.11.2024, 15:52, "Александр Коновалов a.v.konovalov87_AT_mail.ru" < > [email protected]>: > Кому: [email protected] ([email protected]); > Тема: Синтаксис словарей в Рефале!; > > > Василий Игоревич! > > *«Если предлагаемое выражение длиннее уже имеющегося, зачем его вводить?»* > > Новый синтаксис короче, т.к. разбираемая переменная упоминается только > один раз. А для частного случая 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>; > > Случай тождественной линзы на практике будет распространённым, для него > можно ввести сокращённую запись, например `перем @ [= образец]`. > > С уважением, > Александр Коновалов > > > > > > >
