Добрый вечер, Сергей Юрьевич!
С функциями высших порядков согласен, они существенно повышают выразительность.
Я к ним (Map, MapAccum, Reduce) настолько привык, что использую их и в
программировании на чистом Рефале-5, правда приходится немного извращаться
(добавлять новую entry-функцию):
https://mazdaywik.github.io/refal-5-framework/LibraryEx.html#функции-высшего-порядка
(https://mazdaywik.github.io/refal-5-framework/LibraryEx.html#%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-%D0%B2%D1%8B%D1%81%D1%88%D0%B5%D0%B3%D0%BE-%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0)
Возможно, когда-нибудь напишу препроцессор для Рефала-5, который преобразует
вложенные функции во что-то подобное.
То, что Вы называете «линзы», другие называют парой из геттера и сеттера или
акцессора и модификатора. Про возможный синтаксис для геттеров в образцах я
написал в ответе Аркадию Валентиновичу в третьем письме дискуссии:
> Можно, используя условия:
> /*
> t.Expr ::=
> (t.Pos Ident e.Name)
> | (t.Pos Const e.Value)
> | (t.Pos t.Expr s.BinOp t.Expr)
> | …
> t.PureExpr ::=
> (Ident e.Name)
> | (Const e.Value)
> | (t.Expr s.BinOp t.Expr) -- намеренно нерекурсивно!
> | …
> */
> // <Pure t.Expr> == t.PureExpr -- нерекурсивная!
> Pure { ... }
> SomeParserFunc {
> … t.Expr …
> , <Pure t.Expr> : (Name e.VarName)
> …
> }
> Немного многословно (есть некоторое количество синтаксического шума), но
> работать будет. Можно для этой идиомы придумать какой-нибудь синтаксический
> сахар, в котором будет меньше синтаксического шума — по аналогии с
> экстракторами в Scala (см. метод unapply). Скажем, как-то так:
> SomeParserFunc {
> … t.Expr @ <Pure (Name e.VarName)> …
> }
> Т.е. запись
> … VAR @ <EXTR PATTERN> …
> является сокращённой записью
> … VAR …, <EXTR VAR> : PATTERN
> неуспех в экстракторе EXTR приводит к неуспеху образца. Если не нравятся
> угловые скобки в образце, можно использовать квадратные:
> … VAR @ [EXTR PATTERN] …
А сеттер — это просто вызов соответствующей функции <SetName t.Expr e.VarName>.
А работа с кодом программы во время выполнения — это уже особенность не Рефала
как языка, а конкретной реализации.
С уважением,
Александр Коновалов
Отправлено из Mailspring (https://getmailspring.com/), лучшего бесплатного
приложения электронной почты
On нояб. 13 2024, at 5:05 вечера, Sergei Skorobogatov
s.yu.skorobogatov_AT_gmail.com <[email protected]> wrote:
> Добрый день, Саша!
>
> On Wed, Nov 13, 2024 at 3:41 PM Александр Коновалов
> a.v.konovalov87_AT_mail.ru (http://a.v.konovalov87_AT_mail.ru)
> <[email protected] (mailto:[email protected])> wrote:
> > Кстати, на Ваш теперешний взгляд, это какие изменения?
> >
> >
> >
>
> Если мы берём Рефал-5, то изменения такие:
> 1. превращение блоков в функции высших порядков (как в Рефал-7);
> 2. то, что я про себя уже много лет называю "линзы", т.е. некоторый механизм,
> позволяющий функции видеть не то объектное выражение, которое ей передали в
> качестве аргумента, а его преобразованный упрощённый вариант, и производить
> манипуляции с этим упрощённым вариантом, отображаемые на исходное объектное
> выражение (что-то наподобие views в реляционных базах данных, когда есть
> настоящие таблицы, а есть производные таблицы, построенные на основе
> настоящих, и при некоторых условиях запись в эти производные таблицы приводит
> к обновлению настоящих таблиц);
> 3. представление Рефал-кода в виде объектных выражений, т.е. возможность
> ана��иза, преобразования и выполнения Рефал-кода, представленного в виде
> объектных выражений.
>
> Вот как-то так :-)