LINUX.ORG.RU

Почему макросы в стиле лиспа не стали популярными?

 


3

7

В лиспе есть чудесное свойство: код и данные выглядят одинаково. Это позволяет очень легко и естественно писать код, генерирующий другой код. Что называется макросом.

Однако в индустрии данный подход применяется нечасто.

К примеру в С используется отдельный язык, генерирующий текст (препроцессор).

В С++ используется отдельный язык на шаблонах для метапрограммирования.

В Scheme тоже изобрели отдельный язык.

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

Если говорить про не-лисповые языки, то естественным кажется ввести официальный API для AST (по сути там ерунда) и разрешить писать функции, возвращающие этот самый AST. Это будет всё же лучше, чем текст и концептуально более похоже на лисп. Но я такого не видел. Разве что в Java есть annotation processor-ы, но и там такой подход это на уровне хаков скорей.

Можно сказать, что достаточно популярен подход, при котором генерируется исходный код перед компиляцией, к примеру из openapi спецификации. Это близко к постановке задачи, но всё же не совсем то.

Мне кажется идея генерировать код тем же языком, которым он пишется, на 100% естественной и удачной. Единственное, что я бы тут дополнил - сохранять весь этот сгенерированный код в хорошо отформатированном виде где-то в каталоге с остальными артефактами сборки и предоставлять простую навигацию, чтобы не нужно было гадать, что же там эти макросы нагенерировали. Но это уже мелочи и вопрос инструментария, а не что-то фундаментальное.

Почему же так не делают? Зачем почти в каждом языке изобретают какие-то особые пути для метапрограммирования?

★★★★

Все кому надо – делают.

официальный API для AST

В scala макросы встроены в язык уже очень давно. В C++ есть clang libtooling, умеющий в трансформации как на лету в процессе компиляции, так и сорцы в сорцы (src в target/src.transformed, лично я пришёл к предпочтению этого подхода). Для жавы – можно форкать lombok, чтобы добавить в него свои трансформации (цеплять пользовательские макросы как плагины он не умеет), а можно сорцы в сорцы с помощью JavaParser. В расте, тут когда-то рассказывали, макросы тоже встроены в язык, но на вход им подаётся нетипизированное AST.

Что до идиотских аргументов против, они не новы:

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

kremator666 (18.05.2011 16:25:58)

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

// fixed

KRoN73 ***** (18.05.2011 16:58:38)

Меньше всего мейнстриму программисты. Разраб уволился, а код поддердивать некому ибо сперва надо нанять другого.

// fixed

//fixd

nCdy (18.05.2011 17:05:08)

Меньше всего нужны люди. Нет человека — нет проблемы.

Fixed. Слава роботам!

anonymous (18.05.2011 17:11:47)

dimgel ★★★★★
()
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от lovesan

Это все заворачивается и становится ничуть не менее удобным и безопасным чем лисповские макросы, бгг.

А гомоиконность, как уже отмечали выше, ненужна.

Кстати в питоне есть инструменты для работы с AST.

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

гомоиконность, как уже отмечали выше, ненужна.

Кстати в питоне есть инструменты для работы с AST.

Зачем вам AST — это же код в виде данных, харам и ненужно. Херачьте строки регулярками.

Nervous ★★★★★
()
Ответ на: комментарий от dimgel

Все эти немерли, расты, ломбоки итд - они неюзабельны. Во-первых потому что у языков слишком жирное аст, им банально неудобно пользоваться, а во-вторых оно на практике нерасширяемое. А в третьих, оно неизбежно просачивается на метауровень, а оно там нахер не нужно. Поэтому ни eDSL ты на них нормальные не напишешь, ни удобства всякие в язык нормально не понадобавляешь. Это всё абсолютно непрактичная херота.

lovesan ★★★
()
Ответ на: комментарий от cumvillain

Это вряд ли. От немерле выхлопа было ноль, так и помер. Про раст слышен только кукаретинг на форумах, а ломбок в жавамирке считается харам, там вообще считается что писать все надо как на ассемблере, чтобы машине понятно было, а не человеку.

lovesan ★★★
()
Ответ на: комментарий от lovesan

О, наконец переход на личности пошёл! Недолго же Вы продержались, бггг:-)

Я Вам больше скажу - в сложных случаях плюсовый код с шаблонами генерят на питоне. И это работает быстро, хорошо и удобно.

AntonI ★★★★★
()

для начала надо предложить универсальное обобщенное AST, а это то же самое, что предложить универсальный обобщенный язык описания семантики и спецификаций.

и после недолгих размышлений станет ясно, что это получается нечто навроде лиспа.

то есть получается, что надо втыкать лисп и его исполнительную систему внутрь других языков, отчего возникает вопрос - зачем другой язык, если вы уже воткнули в него лисп? вот и пишите все на лиспе.

не нравится на лиспе? тогда смиритесь с тем, что вам не дадут в умелые ручки простые способы рисовать AST на лету.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от lovesan

Про раст слышен только кукаретинг

У нас есть удачные истории больших проектов (discord, cloudflare), у нас есть удачные примеры мелких тулзов (loupe сильно быстрее eog), энкодеры (rav1e). В общем все уже неплохо.

cumvillain
()
Ответ на: комментарий от lovesan

потому что у языков слишком жирное аст, им банально неудобно пользоваться, а во-вторых оно на практике нерасширяемое.

Делал неоднократно на питоне конвертацию математических выражений через ast, расширял синтаксис (вводил разные скобки, факториалы и тд).

Продолжайте озвучивать свое «воинствующее невежество и агрессивное непонимание предмета вообще»(с)

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от cumvillain

Я думал там что-то из разряда замены сишного препроцессора на питон

Есть такой вариант https://nedbatchelder.com/code/cog/ вся генерация кода на питоне добавляется как специального вида комментарии прямо в C++ код. Во многих случаях удобнее чем препроцессор.

anonymous
()
Ответ на: комментарий от cumvillain

Цивилизация синоним слова специализация. Тут давно специалиция - агрессивные клоуны от лиспа могут только в блаблабла, показывать это уже не их профиль:-)

AntonI ★★★★★
()

ЛИШП - это примитивный язык, который идеально подходит для записи обратной польской нотации, а следовательно его интерпретатор может чуть более 1кб занимать Kilo LISP. Он всем хорош, пока не тебе не потребуется реализовать интерфейс с иерархией окошечек, рюшечек… Макросы нужны только для борьбы с убогими возможностями языка. Они зло, так как затрудняют читаемость. В C++ они считаются плохой практикой, это единственный язык из «высокоуровневых», который это говно поддерживает:

// Упоротые и начинающие сионисты не знают, что эта дрисня таит опасность
#define max(a,b) (a < b) ? b : a

// Что такой код
int c = max(++a, ++b);

// Будет заменен на это
int c = (++a < ++b) ? ++b : ++a;

Вывод: не нужно тянуть всякое сомнительное говно в другие языки.

Короче: очередная тема типа той, что в питоне нужна (на самом деле нет) статическая тупизация ря

rtxtxtrx ★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 2)
Ответ на: комментарий от rtxtxtrx

Они зло, так как затрудняют читаемость.
[…]
Вывод: не нужно тянуть всякое сомнительное говно в другие языки.

В C++ они считаются плохой практикой, это единственный язык из «высокоуровневых», который это говно поддерживает:

единственный язык из «высокоуровневых», который это говно поддерживает

Лолшто? Макросы есть в куче высокоуровневых языков, в ОП даже есть несколько примеров. А то, что в С++ они сделаны максимально убого — не является валидным аргументом «против», это просто характеристика C++ как языка.

theNamelessOne ★★★★★
()
Ответ на: комментарий от rtxtxtrx

Кстати, сколько там рантайм sbcl сейчас памяти жрет? Мегабайт 50? А каждая подключена внешняя либа сколько добавляет? Такие же жирные хелловорды я видел только на дотнете.

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)
Ответ на: комментарий от rtxtxtrx

Назови эти языки. Условие: язык должен использоваться в продуктовой разработке и иметь долю хотя бы 0.1% в разработке

https://go.dev/blog/generate

Они везде есть, даже в голанге, который делает вид что их нет.

Вот даже разбор AST: https://eli.thegreenplace.net/2021/rewriting-go-source-code-with-ast-tooling/

cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 1)
Ответ на: комментарий от cumvillain

Кстати, рантайм Go занимает что-то там около 7 мегабайт на линуксе и около 12 мегабайт на винде. И тут он лисп уделал.

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)
Ответ на: комментарий от lovesan

эх щаб утилиты по 7 мегабайт писать, как в 70х

Если можем, почему бы и нет? Растовый ripgrep с документацией и прочим барахлом пять мегабайт в арче весит. И то это много.

cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 1)
Ответ на: комментарий от lovesan

ты всё рассказываешь про очень крутые штуки, но написанные крайне ограниченным количеством людей. Т.е. очевидно, что Symbolics Genera наверняка кому-то очень нужна и очень клевая, но так же очевидно, что этот проект не может стать большим в том числе и из-за того, что он на лиспе.

max_lapshin ★★★★★
()
Ответ на: комментарий от cumvillain

В Go есть каналы, в нем удобно очереди писать. Это язык для сетевого стека. Хз зачем его упоминать в контексте C/C++, он вообще так-то конкурент джавы

rtxtxtrx ★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от max_lapshin

Да он уже был большим(он здоровенный вообще), это древняя ОС из 80х. И писали ее огромное количество людей, которых в Symbolics дофига и больше работало.

Точно так же как щас в гугле работают люди из купленного им ITA Software, на лиспе пишут. Или в Grammarly вот 1.2 тыщи людей работают.

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

lovesan ★★★
()