Сергей Юрьевич, такое совершенно непонятно, как реализовывать, плюс есть
неочевидности по семантике (что для смутного наброска приемлемо). Но выглядит
красиво.
Василий Игоревич, в количестве знаков для e.T выгоды не будет. Выгода в том,
что мы не указываем имя переменной дважды, и если мы захотим её переименовать,
то придётся исправлять меньшее количество мест. Также может быть выгода в том,
что мы подобразец пишем рядом с переменной внутри образца, а не в отдалении — в
условии после образца, что в некоторых случаях может быть удобнее.
Также компилятору может быть проще оптимизировать синтаксис с @ — он просто
заменит все вхождения e.Table в предложение на то, что в скобках, сведя к
базовому синтаксису. Анализ для условий будет сложнее.
Запись с @ может влиять на порядок удлинения открытых переменных:
e.1 @ [: e.2 s.X e.3] '+' (e.A s.X e.B) — здесь во внешнем цикле будет
удлиняться e.2 , во внутреннем — e.A ,
e.1 '+' (e.A s.X e.B), e.1 : e.2 s.X e.3 — здесь во внешнем цикле будет
удлиняться e.A , во внутреннем — e.1 (да, на 1 знак длиннее😀).
Ну и это просто частный случай для линз-геттеров, когда после «[» следует имя
функции-извлекателя.
/*
Возврат скобочного терма означает успех извлечения,
любой другой возврат — неудача.
В языках с неуспехами (Рефал-6, -7, Плюс)
можно было бы возвращать неуспех.
*/
Pos {
(Ident t.Pos e.Name) = (t.Pos);
(Let t.Pos) = (t.Pos);
(Const t.Pos e.Value) = (t.Pos);
(Assign t.Pos) = (t.Pos);
…
e.Other = Fail;
}
Ident {
(Ident t.Pos e.Name) = (e.Name);
e.Other = Fail
}
Let {
(Let t.Pos) = ();
e.Other = Fail;
}
…аналогично для других разновидностей токенов…
Parser {
… t.Token @ [Pos t.Pos] …
t.[Let] t.[Ident e.Name] @ [Pos t.Pos] t.[Assign] e.Expr
, <IsDeclared e.Name> : T
= (Error t.Pos 'redefinition of variable');
}
Здесь я пользуюсь тем, что к переменной можно приписывать несколько
геттеров-линз: t.Token @ [Ident e.Name] @ [Pos t.Pos] и тем, что переменную
можно опустить. Предложение из примера будет эквивалентно
Parser {
… t.Token …, <Pos t.Token> : (t.Pos) …
t.1 t.2 t.3 e.Expr
, <Let t.1> : ()
, <Ident t.2> : (e.Name)
, <Pos t.2> : (t.Pos)
, <Assign t.3> : ()
, <IsDeclared e.Name> : T
= (Error t.Pos 'redefinition of variable');
}
Понятно, что если внутри [ … ] были бы открытые переменные, то эквивалентное
преобразование было бы в разы хитрее.
Синтаксис, конечно, существенно кучерявее, чем в наброске Сергея Юрьевича, но
зато понятно, как его реализовать в терминах Рефала-5.
Линзы-геттеры-экстракторы можно использовать почти как замену спецификаторов
Рефала-2:
Digit {
s.X, '0123456789' : e.1 s.X e.2 = ();
/* я помню про функцию Type, но в Рефале-5 она стрёмная */
s.Other = Fail;
}
NotADigit {
s.[Digit] = Fail;
s.Other = ();
}
Digits {
s.[Digit] e.Digits = <Digits e.Digits>;
/* пусто */ = ();
e.Other = Fail;
}
или так:
Digits {
e.1 s.[NotADigit] e.2 = False;
e.1 (e.2) e.3 = False;
e.1 = ();
}
SearchPhone {
e.1 '+7' e.Phone @ [Digits] s.[NotADigit] e.2 = e.Phone;
e.1 '+7' e.Phone @ [Digits] = e.Phone;
}
По-моему, средство оказывается достаточно выразительным, и отношение
«выразительность/сложность» не сильно снижает.
С уважением,
Александр Коновалов
On нояб. 14 2024, at 4:15 дня, Стеллецкий Василий sw710_AT_yandex.ru
<[email protected]> wrote:
> Александр Владимирович!
> Т.е. выгода из-за длины идентификатора 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] (mailto:[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] (mailto:[email protected])
> > >
> > >
> > >
> > > ----------------
> > > 14.11.2024, 15:14, "Александр Коновалов a.v.konovalov87_AT_mail.ru"
> > > <[email protected] (mailto:[email protected])>:
> > > Кому: [email protected] (mailto:[email protected]) ([email protected]
> > > (mailto:[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>;
> > > > Случай тождественной линзы на практике будет распространённым, для него
> > > > можно ввести сокращённую запись, например `перем @ [= образец]`.
> > > >
> > > > С уважением,
> > > > Александр Коновалов
> > >
> > >
> > >
> >
>
>
>