LINUX.ORG.RU

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

 


3

7

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

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

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

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

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

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

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

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

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

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

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

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

C++ (как и Си) не поддерживает макросов лиспа, просто возможности препроцессора там случайно назвали тем же словом, но на самом деле ничего общего в этих макросах нет.

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

Напоминает адептов функциональщины у которых и переменные в сиподобных языках не переменные (их даже не смущает то, что что-то назыввающесся переменным является постоянным). Словоблудие ряяяяяяя!

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

Grammarly достаточно большое.

А так, в мире много откровенно глупых, я уж не говорю, несправедливых вещей. Если какой-нибудь Javascript мега-популярен, это еще не повод на нем писать. Повод скорее его сторониться.

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

в мире много откровенно глупых, я уж не говорю, несправедливых вещей

Др-до. И самая несправедливая нсправделивость - то что Вас, такого умного и красивого, мир дружно считает унылым клоуном. А ведь Вы знаете лисп!

Так че там с запрошенным у Вас енкодером на лиспе? Кроме блаблабла сегодня от Вас нить будет?

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

Несправедливость и глупость, это в частности, такое повальное распространение такого откровенного трэша и цирка уродов, как Python, или JS, или даже Rust. Но еще большая глупость, на это ссылаться.

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

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

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

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

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

Энкодеры-то где? А то вижу кучу слов что rust такой-сякой, ведь есть же лисп! Давай, показывай, где результаты-то. Мегасервисы типа граммарли не считаются, там поцоны вольны скалироваться хоть целыми стойками.

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

Ну да, ну да - если Вы чего то не видите/не знаете, то этого конечно нет в природе!

у тебя эрудиция на уровне плинтуса, и эффект данинга-крюгера

Дяденька, Ваши проекции настолько унылы…

Пока гитхаб не покажешь, можешь считать что ты в бане у меня

Я два километра бежала за вами что бы сказать как вы мне безразличны!

Ржу в голос.

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

Я же говорил - лавсанчег специализируется на балабольстве, енкодеры показывать это совсем не его профиль

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

Дяденька, Вы точно в садик перестали ходить? Хотя дислексии все возрасты покорны… соболезную.

Видимо лишпь Вам так зашёл потому, что с Вашей дислексией другие ЯП кажутся совсем непонятными - там слишком много букоф. А в лиспе сплошные скобки, даже Вы можете разобраться!

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от lovesan
— Эй ты, благородный дон! — закричал один. — А ну, предъяви подорожную!

— Хамье! — стеклянным голосом произнес Румата. — Вы же неграмотны, зачем вам подорожная?
AntonI ★★★★★
()
Ответ на: комментарий от rtxtxtrx

Не, в питоне в таком синтаксисе не выйдет. Если только через евал, и то не факт. Или как то исключение хитро ловить без трая

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

ладно, покажи мне хотя бы пару крупных проектов на лиспе

https://github.com/razum2um/awesome-clojure#awesome-products-in-clojure

Хорошая ссыль, жаль что «хотя бы пару крупных проектов на лиспе» она так и не показывает :)

Не морщи лоб - это потому что их тупо нет.

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

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

В РФ пропаганда однополой любви - харам. Потонизды опасносте! :-)

И это работает быстро, хорошо и удобно.

Только народ вас всё равно пидо…низдами кличет :) Неблагодарные.

anonymous
()

C++шники как всегда. У нас этого нет и не нужно. А ещё путают свои макросы курильщиков с макросами нормального человека.

А зачем тогда плюсовик пилит такю вещь как circle https://www.circle-lang.org/ ? Там можно код генерировать на этапе компиляции без использования питонов.

Потому что этот человек дурачок? А он компилятор Си++ написал. А вы так сможете?

Признайте, что вы макаки и поэтому вы хейтите макросы и лиспы!

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

Ничего не поделаешь, в петоне delayed evaluation для произвольного выражения можно только эвалом строки или явным оборачиванием выражения в функцию. Типа такого

def iff(condition, consequent, alternative):
    if condition:
        return consequent()
    else:
        return alternative()

print(iff(True, lambda: 1, lambda: 2))
print(iff(False, lambda: 1, lambda: 2))
print(iff(True, lambda: 1, lambda: 1/0))

Так что весь петон целиком тянет максимум на одно лиспощупальце %)

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

Ничего не поделаешь

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

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

Ещё тернарный if else ленивый, and, or и мб ещё че то есть

Мы тут про доступную пользователю ленивость. Чтобы мочь написать свои аналоги if, and, or. Скажем, unless, который if наоборот.

Генераторы тоже не помогут, они вычисляют свои аргументы.

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

Ну лямбды/евал. Но это не проблема, это не главная проблема питона, и уж тем более это не влияет на выбор питон vs лисп :-)

И кроме питона с лиспом есть и другие ЯП.

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

Вообще эта гомоиконность бывает?

Я вот в лиспе её знаю.

Ещё есть упоротая борода под названием XSLT. Там тоже типа язык программирования в синтаксисе XML. Правда не видел, чтобы там генерировали код кодом, но, наверное, и такое возможно (хотя не уверен).

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

Кто ещё гомоиконен кроме лиспа?

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

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

Не спорьте с вьюношем имеющим взор горящий - у него только четверть закончилась, он вне себя от счастья!

Кто ещё гомоиконен кроме лиспа?

Смаллток? Брейнфак?:-)

ЯП умеющих ковырять свое AST довольно много - вон даже С++ так может с некоторыми компайлерами (выше писали). Если в ЯП есть евал+перегрузка операций, то для фрагментов кода уже можно такое наколхозить. Это все в каком то виде гомоиконность.

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

Обход AST это далеко не всегда весело.

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

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

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

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

На самом деле, Лисп настолько гениален, что впору считать, что МакКарти его не изобрел, а открыл. Конкретная форма, разумеется, определяется создателем (возможно мы бы сейчас потешались не над круглыми скобками, а над другим символом), но общая заложенная идея точно тянет на открытие.

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

Ты бы всё-таки определение homoiconicity прочитал наконец. Может тогда твои уши прочистятся и ты услышишь истошные крики совы своих несуразных аргументов, натягиваемой на глобус ясного и строгого определения понятия. Вот у таких потом и мужики в платье тоже женщины, в каком-то виде АХАХАХА.

anonymous
()