Буду отвечать по тексту, и прошу прощения за задержку:
26 июля 2017 г., 21:24 пользователь Александр Коновалов < a.v.konovalo...@mail.ru> написал: > Добрый день, Аркадий! > > > > Большое спасибо за развёрнутый ответ. Сейчас я задам несколько развёрнутых > вопросов. Заранее прощу прощения у подписчиков за многабукаф. > > > > *… **а именно, с включением вложенных анонимных функций -- аналога > лямбда-абстракции.…* > > > > Эта идея не моя, впервые она была предложена Сергеем Скоробогатовым > в диалекте Refal-7 в 2006 году: > https://waybackmachine.org/web/20070813011422/http://iu9.bms > tu.ru/science/refal.pdf > <https://waybackmachine.org/web/20070813011422/http:/iu9.bmstu.ru/science/refal.pdf> > (даю ссылку на Wayback Machine, поскольку с сайта кафедры этот файл > удалили). Вероятно, вы знакомы с ним (и со Скоробогатовым, и с диалектом), > но ссылку я даю для всех читателей рассылки. > Да, конечно, Сергея я хорошо знаю, также немного знаком с проектом Рефал-7. Насколько я понял, там у него вложенные именованные функции, а у Вас только анонимные, да? И отсутствие именованных для случая рекурсивных функций вы компенсируете использованием комбинатора Y. Это действительно очень круто и интересно. > > > *…(только поверхностно посмотрел доки)…* > > > > Основная дока (manul.pdf > <https://github.com/bmstu-iu9/simple-refal/blob/master/doc/manul.pdf>), > к сожалению, (а) недописана, (б) частично неактуальна. Основной массив > знаний (если углубляться) скрывается тут: https://github.com/bmstu-iu9/s > imple-refal/issues (включая закрытые задачи). Но на беглый просмотр там > слишком много. > > > > *…было бы интересно и важно наработать множество примеров и техник с > использованием этих новых средств, демонстрирующих их удобство и > преимущество.* > > > > Пользуюсь вложенными функциями уже с 2009 года, мне нравится. Когда > добавил их в язык, почувствовал прирост своей производительности, > по сравнению с подмножеством Базисного Рефала. Пример их использования > (несколько извращённый) вот: > https://github.com/bmstu-iu9/simple-refal/tree/master/doc/examples/inifile > Более нормальные примеры использования есть в исходных текстах самого > компилятора. > > > > *Есть основания полагать, что Рефал создавался Турчиным именно как язык > первого порядка, и в этом была интенция автора. … Рефал-5 -- это максимум > того, что он был готов допустить.* > > > > Есть у меня идеи по статической типизации Рефала (но о них сейчас пока > рано, через несколько месяцев будет в самый раз), и обдумывая их, я понял > гений Турчина. РЕФАЛ-5 — это довольно компактное и выразительное > подмножество, которое разрабатывалось не только и не столько для > промышленного программирования (хотя писать большие программы на нём > можно — SCP4), сколько для автоматического анализа. Поэтому и язык > первого порядка, и нет неуспехов (но есть условия), и замкнутый набор > встроенных функций. Мои идеи по выводу и проверке типов хорошо ложатся > на РЕФАЛ-5, в то время как с функциями высшего порядка, неуспехами и > сторонними функциями всё не так очевидно. > Это интересно. Когда-то я тоже думал о выводе статитческих типов типов, но до реализации руки не дошли. > > > А в чём согласование с интенцией первого порядка таких особенностей, как > выражения с двусторонним доступом, концепция поля зрения и динамическая > типизация? Мне это немного не очевидно. И что подразумевается под явной > активацией (мне не знаком этот термин)? > Да, это неочевидная, может даже спорная мысль. Я имел в виду, что в соответствие с интенцией первого порядка хорошо, когда все объекты могут иметь образы на бумаге, а еще лучше, когда объект можно отождествить с его образом. А на бумаге мы обычно пишем тексты, которые имеют начало и конец, могут содержать вложенные структуры, то есть быть деревом. И обрабатывать такие структуры уместно с любого конца. А когда всякий объект тождествен своему текстовому структурному образу, естественно говорить о динамической типизации, а не о статической (статический тип это что-то дополнительное к объекту, а динамический он тут же в образе представлен). Концепция поля зрения - это полный образ всей переменной части состояния рефал машины, для обычных языков это стек фреймов или даже что-то более сложное и не имеющее явного "бумажного" образа. Явная активация это такая нотация, при которой вызов функции синтаксически отличается от терма, содержащего символ функции и параметры, и который можно активировать позже. Насколько я понимаю, этим рефал отличается от лиспа, где терм (F x y) в одном контексте интерпретируется как вызов функции F, а в другом (под Quote) как пассивный список из трех элементов. Явная активация в каком-то смысле тоже "вытекает" из принципа тождественности объекта его образу (что вижу, то и имею, ничего лишнего или подразумеваемого). > Вообще, я недавно начал смотреть лекции Абрамова по метавычислениям и > задумался: а каким должен быть промышленный инструмент программиста для > выполнения метавычислений? Подумалось, что это должен быть язык > программирования и компилятор к нему, с хорошей поддержкой рефлексии > (возможность как разобрать в рантайме AST любой функции, так и наоборот, > её построить из AST и тут же вызвать), с возможностью интерпретации > во время компиляции (как в C++14 constexpr), с возможностью сдампить > набор функций в готовый для выполнения модуль. И если в такой среде > реализовать специализатор как обычную библиотечную функцию, то вполне > реализуются все три проекции Футамуры-Турчина. А потом вспомнил «пятикнижие > Турчина» — описанный там язык и описанная там среда вполне подходят под это > описание, разве что constexpr там нету. > Да, надо "всего лишь" уметь извлекать функции из поля памяти в метакоде и класть обратно. Между прочим, в рефале-6 для этого почти все есть, надо только чуток модифицировать (и перекомпилировать) компилятор (чтобы представление в метакоде оставалось где-то в конце выражения, являющегося кодом языка сборки). Проблема лишь в том, чтобы договориться о формате метакода, а на это не хватило духу. > > > *Функциональные объекты этим условиям не удовлетворяют, они > эктенсиональны: функцию можно вызвать, но нельзя препарировать, рассмотреть > ее устройство.* > > > > Да, кстати. У меня (и у Скоробогатова в Refal’е-7) функциональные объекты > сопоставляются с s-переменными. > Да, наверно это правильно. А функция TYPE их как-то выделяет? А замыкание, это наверно уже не символ, а скобочный терм, да? > > > *Но конечно, это не значит, что последователи не вправе делать по-своему, > с опорой на новые знания и опыт. И может быть, особенности Рефала дадут > возможность по новому увидеть и понять функциональные объекты.* > > > > Я разрабатывал (и разрабатываю) диалект Рефал-5λ (который сначала > назывался Простой Рефал), ориентированный на промышленное программирование. > Вложенные функции повышают продуктивность программиста — они есть. > Необходимо расширение возможностей языка — библиотека функций не закрыта, > можно написать свою функцию на Си++. Даже больше. Есть удобный синтаксис > для написания таких функций — вставки кода на Си++ ( > https://github.com/bmstu-iu9/simple-refal/issues/11, > https://github.com/bmstu-iu9/simple-refal/blob/master/src/sr > lib/Library.sref). Т.е. не надо править и менять интерпретатор для > написания ещё одной примитивной функции. Сейчас я работаю над унификацией > с РЕФАЛом-5 (планирую сделать точное надмножество). > > > > *Что касается меня, как приложившего руку к созданию Рефала-6, могу только > сказать, что в последние годы, уже лет 15, выступаю только как пользователь > "своего" диалекта и пока вполне им доволен. Но это, конечно, не > промышленное использование. Есть у Рефала-6 еще по-меньшей мере один > активный пользователь - Игорь Щенков, и он время от времени высказывает > претензии. Но к сожалению сил на них активно откликаться сейчас у меня > очень мало. Се ля ви.* > > > > Когда я начинал программировать на Рефале, я начал с РЕФАЛа-5, пару > программ написал на Рефале-6, а потом начал писать свой диалект J. > Поэтому с идеями Рефала-6 знаком, программы читать могу, но программировать > навыка нет, извините, что не стал вашей пользовательской базой. Кстати, > завидую вам. Ваша пользовательская база по-меньшей мере в два раза больше > моей J. > Пока я писал, в ветке произошла дискуссия о стилях написания кода. И хотя я не хотел встревать, все-таки это дело вкуса во многом, но захотелось высказаться по поводу длины имен переменных. Мне самому часто приходится колебаться между длинным значимыми и однобуквенными (кстати поэтому я в рефале-6 сохраняю бесточечную запись: e1, sA, ...). И в пользу коротких есть следующий аргумент: Рефал, в отличии от классических императивных языков является двумерным: предложение естественно пишется в строку, а группа предложений в столбец. Но в предложении есть много чего: левая часть, правая часть, доп.условия, и если имена длинные, то уж очень длинно получается. А ломать строку в столбец - значит терять выразительные возможности горизонтального измерения. Поэтому с однобуквенными именами получатся нагляднее. Причем это особенно важно, когда левых частей много, они длинные и мало отличаются. Тогда при записи их непосредственно друг под другом лучше видны все отличия. Проиллюстрирую Вашим примером https://github.com/bmstu-iu9/simple-refal/blob/master/doc/examples/inifile/inifile.sref Там в конце есть вызов Reducе, в котором вложен функциональный блок с шестью предложениями. Если бы их записать в шесть строк, с выравниванием, думаю, стало бы легче понимать. Но тогда лучше сильно сократить имена. Кроме того, имена нужны по семантике для того, чтобы сразу видеть, где имена одинаковые, а где разные. С короткими (однобуквенными) это легче. А для понимания смысла, я обычно предваряю комментарием, где поясняется смысл каждой переменной. Аркадий. > > *From**:* Arkady Klimov [mailto:arkady.kli...@gmail.com] > *Sent**:* Wednesday, July 26, 2017 2:23 PM > *To**:* refal@botik.ru > *Subject:* Re: FW: Рефал умер? > > > > Здравствуйте, Александр! > > > > Рефал жив людьми, которые им занимаются, пользуются и т.п., и вы своей > деятельностью вносите свой вклад. Причем я считаю ваш проект в этом смысле > очень ценным, поскольку в нем делается попытка привнести в Рефал функции > высших порядков на более продвинутом уровне, чем это делается Рефалами > прежними, а именно, с включением вложенных анонимных функций -- аналога > лямбда-абстракции. Можно спорить, надо ли это, какой в этом > "практический"смысл, но в любом случае такое исследование и ценно и > поучительно. Я еще плохо знаю о ваших достижениях (только поверхностно > посмотрел доки), но думаю, что на этом этапе было бы интересно и важно > наработать множество примеров и техник с использованием этих новых средств, > демонстрирующих их удобство и преимущество. > > > > Правда, уже сейчас можно высказать и возражение. Есть основания полагать, > что Рефал создавался Турчиным именно как язык первого порядка, и в этом > была интенция автора. И другие особенности языка также были с этой > интенцией согласованы, как-то: выражения с двусторонним доступом, явная > активация, концепция "поля зрения", динамическая типизация (отсутствие > статической типизации). Смысл в том, что любой объект, значение переменной, > может быть рассмотрено во всех деталях, записано на бумаге, и при этом все, > что будет видно, и только оно, может использоваться в вычислениях. > Функциональные объекты этим условиям не удовлетворяют, они эктенсиональны: > функцию можно вызвать, но нельзя препарировать, рассмотреть ее устройство. > Это надлежит делать на метауровне, когда одной программе доступен код > другой. И насколько я понимаю, попытки вводить абстракции, функции высших > порядков и т.п. в базовый язык встречали сопротивление Турчина. Рефал-5 -- > это максимум того, что он был готов допустить. Многие дополнительные > возможности Рефала Плюс он уже считал излишними, кажется, даже динамические > ящики. > > > > Но конечно, это не значит, что последователи не вправе делать по-своему, с > опорой на новые знания и опыт. И может быть, особенности Рефала дадут > возможность по новому увидеть и понять функциональные объекты. > > > > Что касается меня, как приложившего руку к созданию Рефала-6, могу только > сказать, что в последние годы, уже лет 15, выступаю только как пользователь > "своего" диалекта и пока вполне им доволен. Но это, конечно, не > промышленное использование. Есть у Рефала-6 еще по-меньшей мере один > активный пользователь - Игорь Щенков, и он время от времени высказывает > претензии. Но к сожалению сил на них активно откликаться сейчас у меня > очень мало. Се ля ви. > > > > С уважением, > > Аркадий Климов, > > *с.н.с. ИППМ РАН,* > > *+7(499)135-32-95* > *+7(916)072-81-48* > > > > 25 июля 2017 г., 15:33 пользователь Александр Коновалов < > a.v.konovalo...@mail.ru> написал: > > В начале 2000-х годов язык Рефал ещё как-то развивался, выходили новые > версии компиляторов: РЕФАЛ-5, Рефал-6, была некоторая активность на сайте > http://wiki.botik.ru/Refaldevel/, был написан компилятор SCP4. Я читал > старый архив рассылки refal@botik.ru, в нём тоже были обсуждения Рефала > и не только (например, сравнивали его с Си++). Потом, практически синхронно > со смертью Турчина, активность спала практически до нуля (архива рассылки > refal-devel в сети не нашёл, судить не могу). > > > > В текущей рассылке (судя по новому архиву) в основном рекламируются > конференции по метавычислениям, выкладываются сканы старых архивных > материалов и Сергей Михайлович Абрамов поздравляет с Новым Годом. > > > > Я правильно понимаю ситуацию, что Рефал появился не от хорошей жизни: > Турчину нужен был инструмент (формальный язык) для выражения идей > метавычислений, суперкомпиляции, существовавшие тогда Фортран и Алгол для > этого не подходили, а о Лиспе в СССР никто тогда не знал? И теперь, когда > появились новые, современные функциональные языки программирования, для > реализации идей суперкомпиляции стали применять уже их? Те же Юрий Климов > и Илья Ключников свои суперкомпиляторы писали отнюдь не на Рефале. А язык > Рефал остался в прошлом. > > > > И то, чем я занимаюсь (https://github.com/bmstu-iu9/simple-refal > (смотреть ветку refal-5-lambda), https://github.com/Mazdaywik/mrefal) уже > в проекте устарело на десятилетия? Не, своим хобби я заниматься продолжу, > мне это интересно. Хоть и бесперспективно. > > > > -- > > Коновалов Александр Владимирович, преподаватель > > кафедра ИУ9 «Теоретическая информатика и компьютерные технологии» > > МГТУ имени Н. Э. Баумана, Москва > > > > >