Сергей Юрьевич, такое совершенно непонятно, как реализовывать, плюс есть 
неочевидности по семантике (что для смутного наброска приемлемо). Но выглядит 
красиво.

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

  • Re:... Александр Коновалов 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
      • ... 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

Ответить