LINUX.ORG.RU

Чем так хороши макросы в Lisp?

 


4

7

Уже много всякого прочитал про лисп(в том числе Practical Common Lisp и уже даже освоился с Clojure), но никак не могу понять, чем же на самом деле являются макросы в этом языке. И этот вопрос не дает мне покоя т.к. лисп сильно повлиял на мое мышление и я вижу, что лисп (а особенно, common lisp для своего времени), действительно, лучше и удобней других языков (ну, за исключением странного скобочного синтаксиса ^^) ... Если бы его преимущества заключались в динамической типизации, сборке мусора и интерактивном цикле разработки, то их в полной мере имели бы питон, javascript и даже php.

Обычно пишут, что макросы - сильная сторона лиспа, которая отличает его от других языков и в качестве аргументов приводят неудачные примеры, которые довольно просто реализовать в других языках. Может кто-нибудь объяснить более-менее формально, что такое макросы? В чем их преимущества?

Для себя мне удалось выделить лишь два свойства макроса, отличающих его от функции:

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

Первое мне видится ограничением, которое приводит к целому ряду неудобств, как, например, невозможность применить apply к макросу(особено часто хочится сделать (apply and ...) или (reduce and ...)).

А второе может быть легко реализовано посредством функций высшего порядка хоть в C и C++. Для примера, в весьма популярной книге «Приемы объектно-ориентированного проектирования. Паттерны проектирования» Э. Гамма, Р. Хелм, Р. Джонсон, Д.Влиссидес описываются пaттерны Command и Interpreter - в комбинации это в точности макросы времени выполнения...



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

Без мощных средств метапрограммирования не выйдет.

anonymous
()

Макросы - средство расширения компилятора. В современных языках это делается плагинами и препроцессорами. А в тупом древнем лиспе просир пошли по пути наименьшего сопротивления, сделав самый простой вариант расширения языка.

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

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

anonymous
()

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

Очень удачное объяснение с примерами в ANSI Common Lisp. Книга есть на русском. «Being able to change what the compiler sees is almost like being able to rewrite it».

seg-fault
()

Паттерны проектирования

Когда я слышу эти слова, я вспоминаю P. Graham:

For example, in the OO world you hear a good deal about «patterns». I wonder if these patterns are not sometimes evidence of case (c), the human compiler, at work. When I see patterns in my programs, I consider it a sign of trouble. The shape of a program should reflect only the problem it needs to solve. Any other regularity in the code is a sign, to me at least, that I'm using abstractions that aren't powerful enough-- often that I'm generating by hand the expansions of some macro that I need to write.

anonymous
()

макросы lisp'а хороши тем, что они выполняются на этапе компеляции при этом они сами пишутся на том же языке на котором пишется остальная программа.
Вот в C++, макросы есть, но язык макросов очень убог, есть шаблоны — и они тоже очень ограничены и корявы.

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

создание списка в подарок.

А как ты apply без списка хочешь вызывать, а?

вычисление всех аргументов

Невосполнимая потеря.

shamaz
()

ностальгия

прочитал твоё сообщение и прослезился: я тоже когда-то лез во все конференции (к своему стыду, не только на ЛОР) с самыми дурацкими вопросами по лиспу...

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

Я вообще про идею передачи and как функции. Если так делать, то она себя ведёт по-другому и слабо соответствует своему названию.

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

слабо соответствует своему названию

Соответствует на ура. Если все параметры не nil, то вернет не nil. А то, что теряется ленивость, ничего не поделать, язык такой.

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

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

shamaz
()

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

(ну, за исключением странного скобочного синтаксиса ^^)

По-моему, ты чего-то не видишь.

anonymous
()

А на lisper.ru том треде траль всё не унимается.

shamaz
()

Тем, что можно смотреть на всех, как на говно.

Вот представь, подходит к тебе начальник с утречка в понедельник, да спрашивает, мол, где обещанный код. А ты ему такой с вертушки: «Да вы, быдлокодерня, ничего не понимаете! Ща я на анафорических макросах пандорический захват сделаю, получится метациркулярный вычислитель, и усё будет!»

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

anonymous
()

Правда, триумф твой будет недолгим. На следующий день у тебя спросят: ну, и где же твой метациркулярный вычислитель? Тут выяснится, что ты только начал переписывать весь проект на лиспе; что тебе нужен Allegro CL для анафорических лямбд и LispWorks для пандорического захвата; но вообще надо будет создать свой лисп и переписать весь проект на нём; и да, работать это будет только под LISP OS на LISP-компьютере, которые тоже придётся создать.

Тут-то тебя и выпиздят ссаными тряпками с волчьим билетом. И поделом.

anonymous
()

Если серьёзно, кажущиеся «преимущества макросов» сильно преувеличены местными кукаретиками, говнолитиками и кококодемиками. На синтетических примерах макросы позволяют экономить несколько строк. Но перед промышленной разработкой ПО стоят проблемы совершенно другого масштаба, и лисповые макросы их не решают. Это и обусловило фиаско лиспа как промышленного языка. Поэтому на сегодняшний день он является тем, чем является, — скриптовым языком для AutoCAD, языком конфигов для Emacs и GIMP, да языком для сугубо академических поделок и быстрых прототипов.

Чтобы не быть голословным, приведу в качестве примера эпический тред. Чувак обсчитывал фотографии по Bayer-паттерну. Ему не понравилось, что сишный код якобы слишком корявый, и спросил, можно ли его улучшить c помощью лисповых макросов. Так ему там выкатили «пылающую маргинальностью» портянку скобкоговна, по сравнению с которой исходный сишный код был образцом читаемости. И это ещё не самая сложная практическая задача из реального мира, а лисп так позорно сел в лужу.

Вот вам и преимущества лисп-макросов на практике.

anonymous
()
Ответ на: ностальгия от anonymous

я тоже когда-то лез во все конференции (к своему стыду, не только на ЛОР) с самыми дурацкими вопросами по лиспу...

Раз сейчас уже не лезешь, значит, ты либо стал просветлённым лисп-гуру, либо трезвым и прагматичным поборником мейнстрима. Так на какой стороне Силы ты сейчас?

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

На макросах пишут компиляторы eDSL.

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

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

Он на правильной стороне

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

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

Когда я слышу эти слова, я вспоминаю P. Graham

Но ведь если Paul Graham проповедует столь правильную идеологию, почему его положение в IT (прошлом и настоящем) столь ничтожно? Почему его идеология не приносит практических результатов?

Может, потому, что за розовой идеологической дымкой Paul Graham не видит реальных задач, стоящих перед промышленной разработкой ПО?

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

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

Я говорю, что на макросах пишут компиляторы eDSL.

anonymous
()

Извини, но если для тебя аргументированная критика лиспа — это «ахинея», то мне нечего добавить.

И да, похоже, кое-кому тут кое-где припекло. Значит, критика в самую мякотку попала, в самую маточку.

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

Я говорю, что на макросах пишут компиляторы eDSL.

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

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

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

кое-кому тут кое-где припекло

Ух ты! Я даже могу сказать кому

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

А я и не думаю. Лисп-фанбоям никогда ни до чего нет дела; они живут в замкнутом, идеалистическом розовом мирке, где всё состоит из S-выражений, даже небо, даже Аллах. Единственная real-life проблема, которая их волнует, — наличие на столе тарелки борща, заботливо приготовленного мамкой.

Ты ничего не понял. Моя критика обращена не к вам. А то, что у какого-то лиспера от неё бомбануло — побочный, хоть и приятный, эффект.

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

Прости, но по теме я уже высказался выше. Если ты не умеешь читать, то разве это моя проблема?

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

Специалист: (аргументированная критика, снабженная логическими доводами)
Лиспер: Слив засчитан олололо!!!111
Специалист: (пожимает плечами)

anonymous
()

Лол, Development такой Development.

1. Запость копипасту про лисп
2. Дождись анонимуса
...
3. Массовый БУГУРТ лиспарей!!!

anonymous
()

опять лиспофобы слетелись... Что-то у них подозрительная активность в последнее время. К чему бы это?

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

Сила действия равна силе противодействия. Первопричина — в повышенной активности лисп-фанбоев. Может, Ханука?

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

...Один и тот же БУГУРТ лиспачей в финале, да.

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

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

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

Складывается впечатление, что именно лиспофобам и надо: сами себя анонимно возбудят, сами потом...

У меня сложилось впечатление, что анонимус-лиспофоб тут вообще один. По крайней мере, стилистика и любовь к пасте из треда в тред одна и та же.

А периодически кажется, что этот анонимус ещё и бот...

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.