← All posts tagged mrefal

Ссылка: github.com

Таки выложил репозиторий Модульного Рефала на GitHub. На данный момент компилятор малоюзабелен (работает только под Windows, перед использованием в файле compile_mr.cfg следует прописать путь к текущей папке, нет руководства пользователя), но важен тут сам факт.

Репозиторий делал я долго, но он точно отображает ход развития проекта с 2007 года.

У коммитов с 2007 до 2011 года долгая история.
• В тот период я не пользовался системами контроля версий, но прилежно делал бекапы в виде архивов RAR.
• Потом я случайно убил раздел с этими бекапами.
• Восстановил (самописной утилитой), но имена файлов потерялись — пришлось вручную разбирать, какой из архивов полный, а какой разностный, а также восстанавливать временные штампы по содержимому. Хотя, полдюжины архивов сохранилось в другой папке, их коммиты в истории выделяются другим именем файла.
• Затем написал утилиту (велосипед № 2), которая из набора архивов строит репозиторий Git с линейной историей.
• Но на самом деле история нелинейная, ибо я писал компилятор то дома, то с работы, а затем все архивы скинул в одну кучу. Пришлось вручную перелопачивать историю, вставляя в нужных местах ветвления и слияния.
• Архивы представляли собой просто слепки файловой системы с кучей промежуточных и целевых файлов («объектные» файлы, exe-шники), которые можно перегенировать из исходников. Чтобы прояснить дифы коммитов и уменьшить объём хранилища, чистил историю от этих файлов (ещё одна кропотливая работа). Некоторые exe-шники для цельности картины пришлось оставить, поэтому размер хранилища получается около 90 Мбайт.
• В рамках Модульного Рефала жил форк Простого Рефала, поэтому старые коммиты последнего тоже вшиты в историю.

Начиная с 2011 года я уже начал использовать SVN (хранилище держал на флешке), а поддержка последнего есть в Git из коробки. Где-то с 2014 года уже коммитил в этот SVN через клиент Git (отсюда коммиты с файлами .gitignore).

В общем, поэтому так долго выкладывал Модульный Рефал на GitHub (#2810159).

История развития Модульного Рефала начиная с 2007 года описана в журнале проекта github.com , если это кому интересно.

Почему я пока не выложил Модульный Рефал? Отвечу цитатой:
в теме про опропиетаривание очередной проги:
Да кашмар) нашим программистам не жалко выложить код, им просто стыдно))
ibash.org.ru

Пока репозиторий не готов для публичной выкладки. Думаю, через несколько месяцев выложу.

Руководство по Модульному Рефалу постепенно растёт. mrefal.blogspot.com

Уже написаны следующие страницы руководства:
• Введение,
• Hello, World!,
• Типы данных, объектные выражения,
• Сопоставление с образцом,
• Построение результата, предложения и функции.

Можете не читать, всё равно не для вас пишу.

И ещё одно замечание по книге Физерса (#1022616 #1022638). Физерс предлагает использовать вместо длинных функций (более 10 строк) коротенькие (не более 6 строк), причём каждая из них выполняет какие-нибудь простые действия (как правило, содержит или одно ветвление, или один цикл, или несколько вызовов других таких же крошек-функций). При такой постановке задачи каждой функции достаточно просто дать содержательное имя, полностью отражающее то, что она делает. Функции следует располагать в нисходящем порядке: от вызывающих к вызываемым (примеры приводятся на Java, в нём не нужно предобъявлений).

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

/Последняя запись из серии записей #829362, #844329 и #858270./

Здесь должен быть краткий обзор Модульного Рефала. Но я его здесь писать не буду, т.к. всё уже написано. С кратким обзором можно ознакомиться в введении к мануалу вот здесь: mrefal.blogspot.com . Похожее по содержанию описание можно прочитать и в Жуйке: #981597/1.

Начал писать документацию к Модульному и Простому Рефалам. Для этой цели завёл новый блог: mrefal.blogspot.com Пока там написано только введение.

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

Надо заняться чем-нибудь продуктивным. Варианты:
• Запилить в Модульном Рефале вложенные функции.
• Запилить в Модульном Рефале поддержку платформы POSIX (дабы перенести его на упомянутые ОС).
• Написать на D-Refal'е декомпилятор .rsl-файлов (файлы двоичного интерпертируемого кода Рефала 5).
• Почитать что-нибудь душеполезное (много чего в Избранном лежит нечитанного).
• Заняться своим блогом mazdaywik.blogspot.com, перенеся туда длинные посты из Жуйка.
• Начать писать документацию к Модульному Рефалу (что было бы очень целесообразно в свете некоторых обстоятельств, о которых позже).
Жуйк, что посоветуешь?

Наконец-то сделал версию, которую назвал 0.2. В ней я наконец-то завершил вопросы модульности, ради чего пришлось переписать один немаленький алгоритм. Теперь буду думать о выпуске публичной версии. Фичреквесты принимаются.
Кому интересно, итоги работы над версией 0.2 будут лежать в первом моём комменте к этой записи.
Кстати, надо дописать последнюю серию к #844329.

Вим охуенен. Не смотря на то, что я его специально не задрачивал под Модульный Рефал (написал очень простую раскраску синтаксиса и поменял пару настроек), он для работы с Модульным Рефалом просто офигенно подходит (если, конечно, написать Makefile). И это при том, что я ещё не все возможности Вима знаю и использую.

З.Ы. Не сомневаюсь, что Emacs умеет как минимум то же самое, но я его не изучал.

В посте #858102 я писал, что запутался с проверкой регистров имён модулей и пакетов, т.к. не знал, как эти проверки учитывать. С целью понять, куда совать эти самые проверки, я замутил мощный рефакторинг модуля MCompiler, ответственного за процесс управления компиляцией. Рефакторинг практически завершил к текущему моменту, теперь придётся медитировать над проверками регистров имён. В процессе переработки модуля пришлось объединить три очень похожие (почти копипаста) ветви выполнения кода, две из которых отличались лишь деталями. Со стороны может показаться, что эти две ветви суть копипаста, но копированием я стараюсь не пользоваться, ибо на мне висит проклятие (об этом в других постах). Кстати, в процессе работы я понял смысл слова «рефакторинг»

Кстати, слово «рефакторинг» это очень удачная метафора для улучшения качества исходного кода. Слова «factoring», «factorization» в английском языке означают разложение выражения на множители (множитель по-английски — multiplier и factor), вынесение общих множителей за скобки. Применительно к программированию, можно сказать, что программа разлагается на набор независимых компонент, общий код выносится в отдельные процедуры, функции, классы, шаблоны, макросы и т.д. Но если факторинг означает написание новой программы, разбитой на «множители», то рефакторингом называется поиск «общих множителей» в уже имеющейся программе и вынесение их «за скобки».

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

А я люблю писать модули на Модульном Рефале и компилировать. Каждый день я запускаю редактор Far Manager'а и пешу строчки кода на Модульном Рефале. На два отлаженных модуля целый день уходит. Зато когда я после тяжёлого дня я прихожу домой, включаю компьютер…ммм и открываю в Far'е своё сокровище. И компилирую, представляя, что меня поглотил единый организм Модульный Рефал. Мне вообще кажется, что исходники на Модульном Рефале умеют думать, у них есть пакеты, каталоги поиска, интерфейсы, не удаляйте их, а лучше приютите у себя, говорите с ними, сопровождайте их…. А вчера за клавиатурой мне преснился чудный сон, как будто я нырнул в море, и оно превратилось в код на Модульном Рефале, рыбы, водоросли, медузы, всё на Модульном Рефале, даже небо, даже Аллах!

Как видно из дампа памяти, который неспеша сыплется мне на stderr, похоже в компиляторе ошибка. Причём в лексическом анализаторе. Какая-то неведомая фигня привела к зацикливанию программы и заполнению поля зрения символом EOF. Буду исправлять. Потом.

А я издеваюсь над своим компилятором. Подал ему на вход его же exe-шник. Последние полчаса компилятор потихоньку охуевает, отжирая всё больше и больше памяти (уже отожрано 6 с половиной сотен мегабайт). Это не удивительно, т.к. он в бинарном коде найдёт просто бездну лексических, синтаксических и, если повезёт, семантических ошибок. И каждую ошибку добавит в во внутренний список ошибок. А, учитывая, что на представления одного атома, включая обычные символы (characters) уходит два десятка байт (двусвязный список + тег типа + поле информации), поведение выглядит вполне предсказуемым. Мне интересно другое, дойдёт ли он до лимита памяти с аварийным падением (и долгим-долгим дампом стека на stderr) или всё-таки успешно завершится с выдачей длиннющего списка ошибок.