Сергей!

«Сам Рефал Плюс - тот же самый. Но, правда, кое-какие косметические "подкрутки" 
во входном языке сделали.»

Т.е. в принципе, пролистать начало всё же стоит. А на счёт <"+" …> → <Add …>, 
запись через "+" не даёт экономии даже в символах. Это в Рефале-5 получается 
короче — <+…>.

«А когда "люди" исчезли, то стало хорошо!»

Понимаю. Сам разрабатываю Рефалы, используемые только в раскрутке и 
самоприменении своих компиляторов. Василий Стеллецкий, я думаю, тоже с нами 
согласится. :-)

А если не жалко своих собственных старых программ, то можно невозбранно ломать 
и обратную совместимость.

«Поэтому многие вещи и Рефале Плюс и выглядят как "искусство для искусства". 
Ставятся некоторые формалистические задачи - и успешно решаются. А что язык 
получился при этом слишком сложный, с точки зрения "простого народа", так ведь 
тут по принципу: "нет народа - нет проблем".»

Ну, есть нюанс. Может получиться в итоге и так: «нет народа — и не будет». 
Поэтому я сделал из «Простого Рефала» Рефал-5λ полностью обратно совместимый с 
Рефалом-5. Хотя толку от этого…

«С точки зрения "чистого искусства" можно считать, что решалась задача: "Что 
можно втащить в Рефал из Пролога, не слишком разваливая функциональность 
Рефала.»

На Прологе я не программировал, поэтому задача мне несколько чужда.

«А более антифункциональная вещь в Рефале Плюс - это то, что неуспехи могут 
вылезать за пределы функции. Тут уже явной прологовщиной припахивает.»

На мой взгляд, вызовы чистых функций, функций, возвращающих неуспех и функций 
«ввода-вывода» (недетерминированных/с побочными эффектами) должны различаться 
синтаксически. Например, имена последних двух категорий должны 
начинаться/заканчиваться соответственно на ? и !. Т.е. это не соглашение, а 
требование синтаксиса языка. И функция ввода-вывода не может возвращать 
неуспех. Да, и функции ввода-вывода не могут вызываться в условиях Рефала-5 
(или эквивалентных им конструкциях других диалектов).

Соображения — в первую очередь стилистические. Второстепенное — возможность 
оптимизации и более эффективной кодогенерации (в том числе включая и 
распараллеливание).

«А "правильный" (с "религиозной" точки зрения) способ работы с переборными 
алгоритмами был описан вот в этой "культовой статье":»

Надо будет почитать.

«Что же касается Рефала Плюс, то до изготовления, скажем, суперкомпилятора для 
него - дело так и не дошло.»

Значит, всё впереди. Хотя, казалось бы, с препринтов 30 лет прошло.

Спасибо за ответ,
Александр Коновалов

 

From: sergei.romane...@gmail.com [mailto:sergei.romane...@gmail.com] On Behalf 
Of Sergei Romanenko
Sent: Tuesday, February 13, 2018 1:22 AM
To: Refal Botik <refal@botik.ru>
Subject: Re: Прогонка для Рефала-4 (Плюс) и $iter

 

2018-02-13 0:49 GMT+03:00 Александр Коновалов <a.v.konovalo...@mail.ru 
<mailto:a.v.konovalo...@mail.ru> >:

«Вот, во втором издании книги … есть глава, в которой подробно описан 
виртуальный код, и как в него Рефал Плюс компилируется.»

Новая глава во втором издании — это «Принципы реализации Рефала Плюс»? Т.е. для 
экономии времени можно начать с неё?

 

Да. Сам Рефал Плюс - тот же самый. Но, правда, кое-какие косметические 
"подкрутки" во входном языке сделали. Например, заменили имена функций, вроде, 
"+"  на текстовые идентификаторы. Это сделали, чтобы "улучшить" интерфейс с 
Явой. Но, может быть, лучше было бы строго придерживаться того входного языка, 
что был в первом издании.

 

«А другой мотив был - сделать выразимым на Рефале Плюс то, что было выразимо на 
уровне виртуального кода (= языке сборки).»

На первый взгляд это воспринимается как «хвост виляет собакой». Но надо 
почитать соответствующую главу, вероятно, станет понятнее.

 

Вилять должны пользователи. А, поскольку после 1991, сообщество пользователей 
разбрелось в разные стороны (искать подножный корм), появилась неслыханная 
свобода творчества. Раньше надо было оглядываться по сторонам, и думать: "а что 
люди скажут"? А когда "люди" исчезли, то стало хорошо! Поразглядывал 
собственный пуп, и, раз - и какую-нибудь "загогулину" в язык вставил. А "люди" 
ничего на это и не скажут (потому что их больше нет вокруг).

Поэтому многие вещи и Рефале Плюс и выглядят как "искусство для искусства". 
Ставятся некоторые формалистические задачи - и успешно решаются. А что язык 
получился при этом слишком сложный, с точки зрения "простого народа", так ведь 
тут по принципу: "нет народа - нет проблем".

 

Сначала наличие оператора цикла в функциональном языке мне (как ценителю 
функционального программирования) немного рвало шаблон. А после прогонки я стал 
воспринимать его более спокойно. Довольно интересная и в чём-то даже красивая 
конструкция, вполне в духе Рефала Плюс. Правда в синтаксисе немного странно 
воспринимается источник, в котором используются переменные, присваиваемые 
дальше по тексту.

 

С точки зрения "чистого искусства" можно считать, что решалась задача: "Что 
можно втащить в Рефал из Пролога, не слишком разваливая функциональность Рефала.

 

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

 

Да, это верно. Сам по себе $iter функциональность подрывает только 
стилистически, но не по существу. Ибо фактически он является просто формой 
записи хвостовой рекурсии.

А более антифункциональная вещь в Рефале Плюс - это то, что неуспехи могут 
вылезать за пределы функции. Тут уже явной прологовщиной припахивает.

А "правильный" (с "религиозной" точки зрения) способ работы с переборными 
алгоритмами был описан вот в этой "культовой статье":

*       Philip Wadler. 1985. How to replace failure by a list of successes. In 
Proc. of a conference on Functional programming languages and computer 
architecture, Jean-Pierre Jouannaud (Ed.). Springer-Verlag New York, Inc., New 
York, NY, USA, 113-128.
https://rkrishnan.org/files/wadler-1985.pdf

А ещё, красиво получилось в примере — функция с повторными переменными 
полностью прогналась, и операция анализа (причём чисто анализа) оказалась 
описана циклом. Но вот все написанные выкладки довольно сложно 
алгоритмизировать (по крайней мере я пока не знаю, как это делается). Сергей! 
Уж не поэтому ли Вы в препринте написали, что преобразования прогонки на 
Рефале-4 есть исчисление, а не алгоритм?

 

Да, прогонка у Турчина - это "исчисление", а не алгоритм. А на её основе можно 
уже делать что-то более сложное. Например, УРА или суперкомпиляцию. А при 
превращении исчисления в алгоритм появляются всякие "эвристики" и "стратегии".

Поэтому, для начала, надо было придумать хотя бы исчисление. Кстати, Лейбниц 
когда-то придумал именно "исчисление бесконечно малых", которое состояло из 
правил. А как применять правила - это уже человек должен был решать. Хотя, при 
этом, Лейбниц мечтал о том, чтобы "заменить размышления вычислениями". Т.е. - 
реально он мечтал об алгоритмах. Но программы аналитического интегрирования, 
например, появились только в 20-м веке.

 

Что же касается Рефала Плюс, то до изготовления, скажем, суперкомпилятора для 
него - дело так и не дошло.

СР

Ответить