Добрый день!

Предлагаю порассуждать на тему применимости Рефала сегодня: какие у него могут 
быть преимущества перед другими языками и как ими можно воспользоваться.
Я могу выделить следующие черты Рефала:
динамически типизированный с закрытым набором типов — есть ограниченный набор 
встроенных типов данных, пользовательские типы конструируются на уровне 
соглашений (исключение: пара моих реализаций, где есть инкапуслирующие 
квадратные скобки — небесспорное расширение) — примерно та же ситуация, что и в 
классической Scheme;

мощное сопоставление с образцом — сопоставлением с образцом сейчас уже никого 
не удивишь, оно есть даже в Питоне (начиная с версии 3.10 или 3.11, и тоже 
довольно выразительное), но есть две достаточно редкие черты:
повторные переменные, и соответственно, встроенное в язык понятие равенства 
(однако, есть в Racket и есть в Scala),

поиск в середине последовательности по образцу «e.X PAT e.Y», аналогичная 
возможность есть только в Tom (https://tom.loria.fr/) (предназначен для работы 
с XML и вообще удивительно похож на Рефал);

встроенная в семантику конкатенация — в результатных выражениях она 
записывается пустым местом, в других языках синтаксис конкатенации более 
многословный,

симметричный доступ к обоим концам последовательности в образцах — в 
большинстве функциональных языков встроенными (основными) последовательностями 
являются однонаправленные списки и образцы допускают обращение только слева, 
исключения — Scala, где есть «:+» и «+:», сопоставление с эллипсисом в макросах 
Scheme и образцах Racket, образцы в Python, но там списки — массивы,

возврат из функции нескольких значений столь же (не)естественнен, как и 
передача нескольких аргументов.

Подытоживая, Рефал — динамически типизированный функциональный язык с 
выразительным сопоставлением с образцом, позволяющий удобно преобразовывать 
иерархические данные, например, синтаксические деревья. И сами данные, и их 
сопоставление с образцом, и построение новых значений записываются без лишнего 
синтаксического шума, т.е. всевозможных запятых, значков «+», «++», «+:» и 
прочих. Благодаря динамической типизации, он годится для быстрого написания 
небольших программ, выполняющих символьные вычисления. Но с другой стороны, 
написание крупных программ, разрабатываемых коллективами затрудняется: типы всё 
равно придётся определять и документировать, что для Рефала, как правило, 
делается комментариями с грамматикой для объектных выражений.
Я пока нашёл только одну сферу, где Рефал неплох и абсолютно уместен — рабочий 
язык для небольшого курса, посвящённого генерации кода. Студенты пишут 
программы, принимающие на входе синтаксическое дерево, и порождающие код для 
модельного ассемблера. Пример синтаксического дерева:
(function gcd (x y)
(var (rem 1))
(while ((L y) "<>" 0)
(rem "=" ((L x) "%" (L y)))
(x "=" (L y))
(y "=" (L rem))
)
(return (L x))
)
Синтаксическое дерево одновременно выглядит как код на ЯП и одновременно 
машиночитаемо — это просто запись объектного выражения Рефала-5. Синтаксис 
Рефала и основные приёмы программирования можно рассказать за две пары, а затем 
уже студенты могут писать компиляторы для подобных программ в рамках домашних 
работ. Более подходящего языка для этого курса я не вижу.

Других применений, где Рефал уместнее других языков программирования, я пока не 
встречал. А вы?
Где ещё Рефал может быть уместнее других языков программирования?

С уважением,
Александр Коновалов
  • Сф... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Arkady Klimov arkady . klimov_AT_gmail . com
      • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Mike Potanin mpotanin_AT_gmail . com
      • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Александр Гусев gusev_aleksandr_AT_mail . ru
      • ... Александр Коновалов a . v . konovalov87_AT_mail . ru

Ответить