Доброе утро всем!

> 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

  • Зап... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Sergei M. Abramov
      • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Andrei Klimov andrei_AT_klimov . net
          • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Василий Стеллецкий swi_AT_cnshb . ru
          • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
            • ... Василий Стеллецкий swi_AT_cnshb . ru
              • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
                • ... Василий Стеллецкий swi_AT_cnshb . ru
                • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
                • ... Василий Стеллецкий swi_AT_cnshb . ru
                • ... Александр Коновалов a . v . konovalov87_AT_mail . ru

Ответить