Доброе утро всем! > 1. Выворачивание скобок наизнанку, для организации прохода по выражению.
К представлению объектных выражений этот приём (антиприём) не имеет отношение. Он, скорее, характерен для базисного Рефала (Рефала-2), в котором нет ничего подобного let-конструкциям (условия, перестройки, действия). И благодаря этому сквозному обходу исчезает нужда во вспомогательных функциях, можно обойтись одной. Но, вообще этот приём уродлив, хоть и пропагандировался Турчиным. > 2. Боязнь копирования кусков выражений в разные «дочерние» функции. А в Рефале-5 ещё и в условия. У меня в Рефале-5λ копирование выражений дорогое, но я копировать их по умолчанию не боюсь. Потому что потом я нахожу узкие места, изучая профиль программы, и устраняю лишние копирования уже в них. А нет ли в Рефале Плюс другой боязни — боязни конкатенации? Задача. Заменить в выражении все символы последовательными натуральными числами: <Enum 'abc' (('de') 'f' ('gh') 'ij') 'k'> → 1 2 3 ((4 5) 6 (7 8) 9 10) 11 Решение на Рефале-5λ, эффективное (O(n)) и простое для понимания (на мой взгляд): Enum { e.Expr = <DoEnum e.Expr 1> : e.Expr^ s.Num = e.Expr; } DoEnum { /* пусто */ s.Num = s.Num; s.X e.Expr s.Num = s.Num <DoEnum e.Expr <+1 s.Num>>; (e.Nested) e.Expr s.Num = <DoEnum e.Nested s.Num> : e.Nested^ s.Num^ = (e.Nested) <DoEnum e.Expr s.Num>; } Конструкции = … : … в Enum и в последнем предложении DoEnum неявно транслируются в вызов вспомогательной функции. Знак ^ после имени переменной в образце означает, что она не повторная. Представление данных — плоское списковое, то самое с дорогим копированием и копеечной конкатенацией. Как будет выглядеть O(n) решение в других диалектах Рефала? С уважением, Александр Коновалов -----Original Message----- From: Sergei M. Abramov abram_AT_botik.ru <refal@botik.ru> Sent: Monday, December 14, 2020 4:27 AM To: Александр Коновалов a.v.konovalov87_AT_mail.ru <refal@botik.ru> Subject: Re: Запахи кода и антипаттерны в Рефале День добрый, всем! > А какие вы можете назвать запахи кода и антипаттерны, характерные для > Рефала? Все, что вскрывает (или скрывает?) недостатки используемого представления объектных выражений и приводит к чудовищному (для пониманию) кода: 1. Выворачивание скобок наизнанку, для организации прохода по выражению. 2. Боязнь копирования кусков выражений в разные "дочерние" функции. Этим страдают многия языки. Например, в Эрланге целый культ на тему "стремись к хвостовой рекурсии!" и "пиши с аккумулятором, а потом выдай результат, навесив на него reverse (Который, видимо, у них написан на не Erlang-е)". Если мы стремимся к самодокументированному коду без комментариев, то такие фенечки должны не приветствоваться. С уважением, Абрамов С.М. ab...@botik.ru мобильный: +7(903)2928308