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)

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

Это представление основное и фундаментальное потому как единственное.

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

Синтаксически - это классический лисп. Код представлен в виде АСТ из форм, каждая форма - список

Интересно... а tcl — это тоже классический лисп? Только с квадратными скобками...

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

Интересно... а tcl — это тоже классический лисп? Только с квадратными скобками...

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

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

по жизни и програмированию, да очень похож.

Толко tcl-щики об этом часто не догадываются :)

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

Опять ламер тупой вылез? Это рабочий код.

Прости, но ты это серьезно? Ты на полном серьезе не видишь синтаксических ошибок в этом коде?

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

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

Читаем 10ю главу (Представление знаний) русского издания по второму Artificial Intelligence: A Modern Approach от Stuart Russell и Peter Norvig

Какое отношение эти академические изыскания имеют к промышленной разработке ПО?

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

Конечно же, это лисп!

Все — лисп!

А кто утверждает обратное, тот — гик, долбоеб и душевно больной человек. Как Стивен Вольфрам.

За невероятные успехи в образовании, юного вундеркинда в детстве часто называли «маленьким Эйнштейном». Образование он получил в Итонском колледже. В возрасте 15 лет опубликовал статью о физике элементарных частиц[3], в 17 лет поступил в Оксфордский университет, где в колледже Святого Джона начинает исследования в физике. Через год опубликовал свою широко процитированную работу по производству тяжелых кварков[2].

С 1978 года свои исследования Вольфрам продолжает в Калифорнийском технологическом институте. Здесь он впервые рассматривает связь между космологией и физикой элементарных частиц, а позже занимается теорией сильных взаимодействий и клеточным автоматом. В 1979 году он получил докторскую степень (PhD)[4].

С 1979 по 1981 гг. руководил в университете разработкой системы компьютерной алгебры SMP (Symbolic Manipulation Program, предшественник Mathematica), однако из-за споров об интеллектуальной собственности, связанных с SMP, он оставил университет[5].

В 1983 году он устроился на работу в Институт перспективных исследований, где работал над моделью клеточных автоматов, которую применял в криптографии и гидродинамике. С 1986 года он работает в Иллинойском университете в Урбана-Шампейн[2], где и началось развитие системы Mathematica, опубликованной в июне 1988 года, а также первый выпуск его журнала «Комплексные системы» (Complex Systems)[6][7].

В 1987 году он основал компанию Wolfram Research в Шампейне, Иллинойс, занимающейся выпуском программного обеспечения, президентом которой является и по сей день.[8]

Работы Вольфрама в физике элементарных частиц, космологии и информатике принесли ему одну из первых наград — «грант для гения» от фонда Макартуров. А его работа с Джеффри Фокс в квантовой хромодинамике до сих пор используется в экспериментальной физике частиц[9].

В 2002 году вышла его книга «Новый вид науки» (A New Kind of Science), результат более чем десятилетней плодотворной работы, которая быстро стала бестселлером.[7]

В марте 2009 года в своём блоге он объявил о запуске базы знаний и набора вычислительных алгоритмов WolframAlpha[10]. В свободном доступе с 16 мая 2009 года[11]. В том же году получил премию Фридриха Людвига Баура (англ.)русск. в Мюнхенском техническом университете[12].

Первая работа по физике элементарных частиц в 15 лет, PhD в 20 лет, куча работ и наград, Wolfram Research — ведь это все ненужно! Он осмелился противоречить ЛОРовскому непризнанному Гению Лиспа, Его Борщейшеству!!!111

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

Какое отношение эти академические изыскания имеют к промышленной разработке ПО?

Дык у него и LISP — промышленный язык, чо.

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

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

Первая работа по физике элементарных частиц в 15 лет

Может он в физике рогом роет, а в других областях фимозит или троллит? Медицине известны разные случаи :)

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

Ты его «A New Kind of Science» почитай - лисперы курят в сторонке.

Почитал. И?

Где там написано, что «Mathematica — это LISP»?

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

Вот где то от 81 до 90го он и подвинулся умом.... судьба вудеркинда :(

anonymous
()

Платиновые цитаты борще-архитектора


«кто-нибудь объяснит мне что значат все эти умные слова?»

«Кто такие хипстеры я себе представляю, каждый вечер в метро встречаю»

«Бухгалтер требует скан паспорта и отказывается платить»

«Как бороться с бухгалтершей, и есть ли у меня вообще шансы увидеть свои кровные денежки»

«Конпеляю, запускаю — фиг там, вместо foo лежит null. ЧЯДНТ? Кастую vertexua»

«Читаю тут простыни разного джаваскрипта»

«Что это за такие трюки, ЛОР? Объясни мне, ламеру»

«Дали тут вести большой проект на Спринге - набор костылей»

«мне с этими костылями ещё не один десяток км предстоит пройти»

«В configure() добавил: bind(IFoo.class).to(Foo.class); Эка всё неочевидно и неавтоматизированно»

«А Ока - многофункциональная машина. В ней можно жить, заниматься сексом, хранить картошку»

«Круто, чо»

«Что не так?»

www.linux.org.ru/people/BYHYRT/


Мухосранская борще-архитектура. Глобально. Надежно. Эффективно.


LISPERS WIN

BRUTALITY

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

Практика показала несостоятельность agile для серьезной разработки. Еще вопросы будут?

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

Наоборот - это как? Говно слетается на мух? Ну ок, я не против такой трактовки.

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

Пальцем ткни в такую «практику». Почему-то в тех же банках про Agile и слышать не желают.

anonymous
()

«Agile методы, когда они надлежащим образом применяются к разработке mission critical систем, помогают предотвратить дорогостоящие ошибки. Agile методы могут также повысить качество разработки и уменьшить затрачиваемые усилия. Они привлекают внимание к рискам, которые становятся причиной неудач, когда их игнорируют, и исключают статическое, баллистическое планирование, которое также ведет к провалу»

— Bruce Douglass, IBM


«Около 33% IT проектов Министерства обороны прекращаются на стадии разработки. Больше 60% превышают сроки и/или бюджет. Министерство обороны сталкивается со многими проблемами, включая ограничения бюджета и сжатые сроки внедрения технологий, что вызывает необходимость в Agile методах»

— Teri Takai, Министерство обороны США


«Исследования SEI сконцентрировались в последние годы на совершенствовании легковесных подходов и процессов под нужды и требования наших спонсоров, партнеров, заказчиков и акционеров. Решение этих задач включает задействовании Agile методов для mission-critical software-reliant систем в таких областях, как финансы, энергетика, телекоммуникации, исследования космоса и авиация»

— Anita Carleton, Software Engineering Institute


«В сентябре 2010 Federal Bureau of Investigation (FBI) переключилось с водопадной модели разработки на Agile методы для завершения Sentinel case management sytem. Команда Noblis была нанята, чтобы помочь FBI перейти на Agile, и внесла ключевой вклад в успешное внедрение Sentinel летом 2012. Сегодня, разработанное с помощью Agile методов case management software используется более 30 000 пользователей для доступа к mission-critical case data»

— Noblis, Washington, DC


«Мы большие фанаты Agile, и используем его в наших самых критически важных проектах»

— Roger Baker, U.S. Department of Veterans Affairs


«Agile вовлекается в определенные области обороны и разведки. Это области типично имеют более сжатые сроки, они более mission focused и требуют быстрой адаптации к новым ситуациям»

— Bob Payne, LitheSpeed


«GAO выявило 32 подхода в качестве эффективных для применения Agile методов разработки ПО для IT проектов. Служащие, использовавшие Agile методы на федеральных проектах, высказывались положительно об их эффективности»

— U.S. Government Accountability Office


«Мартин Фаулер — известный автор, консультант и лектор. За его плечами два десятилетия опыта по внедрению в корпорациях объектных технологий для mission-critical систем. Он работает с такими клиентами, как UK National Health Service, Chrysler, Citibank, и Andersen Consulting»

— Martin Fowler, ThoughtWorks


«Да они все ебанаты!!11»

— Лоровский борще-архитектор, Мухосранск


anonymous
()

Платиновые цитаты борще-архитектора


«кто-нибудь объяснит мне что значат все эти умные слова?»

«Кто такие хипстеры я себе представляю, каждый вечер в метро встречаю»

«Бухгалтер требует скан паспорта и отказывается платить»

«Как бороться с бухгалтершей, и есть ли у меня вообще шансы увидеть свои кровные денежки»

«Конпеляю, запускаю — фиг там, вместо foo лежит null. ЧЯДНТ? Кастую vertexua»

«Читаю тут простыни разного джаваскрипта»

«Что это за такие трюки, ЛОР? Объясни мне, ламеру»

«Дали тут вести большой проект на Спринге - набор костылей»

«мне с этими костылями ещё не один десяток км предстоит пройти»

«В configure() добавил: bind(IFoo.class).to(Foo.class); Эка всё неочевидно и неавтоматизированно»

«А Ока - многофункциональная машина. В ней можно жить, заниматься сексом, хранить картошку»

«Круто, чо»

«Что не так?»

www.linux.org.ru/people/BYHYRT/


Мухосранская борще-архитектура. Глобально. Надежно. Эффективно.


LISPERS WIN

BRUTALITY

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

Так в репле такой же убогий отладчик. Если в SBCL у меня всегда есть backtrace + inspect + выполнение произвольного кода в точке падения, то в racket всё приходится ловить руками.

Ну, так дык, только убогий схемер запускает отладчик) Допустим, при возникновении ошибки выяснилось, что глубина стека вызовов 100000+. Конечно, если вы предугадали место возникновение ошибки, то у вас еще есть шанс воспользоваться отладчиком. А что если вы только поверхностно ознакомились с исходниками? А что если вы имеете дело с продолжением, которое было создано в уже несуществующем потоке? Гораздо удобнее запустить юнит тесты, просмотреть лог отладки и т.п. Примитивизм CL позволяет вам использовать мощный отладчик, но с racket этот вариант ничего кроме батхерта у вас не вызовет.

Я не про компиляцию. Я про ситуацию: разрабатываю что-то, через REPL создал тестовую ситуацию, а потом надо перезагрузить компьютер. В случае SBCL save-lisp-and-die, в случае Racket разве что гибернейт со всей операционкой или внешней утилитой останавливать и сохранять процесс (хорошо если один, а если несколько потоков?).

Я бы организовал кэширование из репла в отладочный модуль. По сути вы создали мега жирный юнит тест. А, кстати, как обстоят дела с макросами? Допустим у вас нет ничего кроме образа и документации к нему, и тут выясняется, что версия установленной у вас динамической библиотеки гораздо более новее, чем поддерживаемая образом, а старая не собирается. Но из документации следует, что вам для исправления сложившейся ситуации необходимо лишь изменить один макрос, который активно используется) Как вы поступите в данной ситуации? Или допустим у вас есть образ созданный в винде, а использовать его нужно в линуксе. Как обстоят дела с кроссплатформенностью?

Какая разница? Главное, чтобы всё состояние (переменные) в памяти лиспа было. Код можно и заново загрузить. По крайней мере я SBCL с биндингом к GTK сохранял в образ и заново загружал.

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

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

Вся правда про лишпег:

Первоапрельская шутка :-) И почти все пункты можно применить почти к любому языку.

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

Допустим, при возникновении ошибки выяснилось, что глубина стека вызовов 100000+.

Такой стек сам по себе уже ошибка.

А что если вы только поверхностно ознакомились с исходниками?

Мне этого хватало, чтобы по падению на моих данных в нужное место воткнуть handler-bind с указанием, как именно эту ошибку обходить.

А что если вы имеете дело с продолжением, которое было создано в уже несуществующем потоке?

То же, что и с замыканием, созданным там же. Я его могу выполнить и могу узнать из какого участка текста оно создано.

Примитивизм CL позволяет вам использовать мощный отладчик, но с racket этот вариант ничего кроме батхерта у вас не вызовет.

Странно. Всегда думал, что чем мощнее язык (в частности рефлексия), тем удобней отладчик на нём можно написать. Более того, отдельный элементы в Racket типа make-inspector как раз под отладчики и заточена

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

Допустим у вас нет ничего кроме образа и документации к нему

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

Противоречие. Ибо макрос влияет только на компиляцию из исходников. Так что либо исходники есть и их просто перекомпилируем в поле видимости изменённого макроса. Либо их нет, но тогда макросы не влияют вообще ни на что.

Или допустим у вас есть образ созданный в винде, а использовать его нужно в линуксе.

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

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

Такой стек сам по себе уже ошибка.

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

Мне этого хватало, чтобы по падению на моих данных в нужное место воткнуть handler-bind с указанием, как именно эту ошибку обходить.

Попробуйте тоже самое сделать на racket)

То же, что и с замыканием, созданным там же. Я его могу выполнить и могу узнать из какого участка текста оно создано.

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

Странно. Всегда думал, что чем мощнее язык (в частности рефлексия), тем удобней отладчик на нём можно написать. Более того, отдельный элементы в Racket типа make-inspector как раз под отладчики и заточена

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

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

Противоречие. Ибо макрос влияет только на компиляцию из исходников. Так что либо исходники есть и их просто перекомпилируем в поле видимости изменённого макроса. Либо их нет, но тогда макросы не влияют вообще ни на что.

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

Если бы речь шла о продакшене, тогда преимущества образа были бы очевидны. Но речь вроде шла про отладку, а именно, когда до продакшена еще далеко. Короче, я не вижу повода создавать >50мб образ, когда гораздо удобнее использовать фаслы.

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

Какое отношение эти академические изыскания имеют к промышленной разработке ПО?

ты хоть прочитал прежде чем лужу газифицировать? :)

ну хотя бы вот например такое http://habrahabr.ru/post/204124/ и такое http://potan.livejournal.com/204270.html

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

Попробуйте тоже самое сделать на racket)

Не могу. Потому что в момент падения текущие данные в структуре, а отладчик не даёт проёти по полям структуры.

Приходится после падения втыкать отладочную печать или даже вызов REPL в место вокруг падения чтобы выяснить при каких же условиях упало. Мучений как на Java (там тоже только stacktrace).

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

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

Гуй как раз дело десятое. Того, что в SBCL в текстовом режиме выше крыши.

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

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

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

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

Исключительно для фиксации состояния. Иначе получается как в Windows: не работает? перезагрузи, скорее всего починится.

Сохранение REPL'а помогает не всегда. У меня была пара ситуаций, когда ошибка вылазила только при определённой последовательности запуска финализаторов на объектах сборщиком мусора. При загрузке лога REPL'а через load, естественно, ошибка не воспроизводилась.

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

основная часть контента вообще не автоматизируется,

то есть, как это «не автоматизируется»? ты вообще себе геймдева воркфлоу представляешь, борщехлеб?

представляешь себе отличия от пропертарных форматов старых моделлеров и формата COLLADA .dae?

как там задаются: сцена, шейдеры, анимация, трансформации, меши, модельки?

что такое параметрическое моделирование?

почему моделлер типа Daz 3D (бесплатно раздавали когда-то) предлагает модели в виде Genesis формате : где можно настраивать типовые модели, совмещая ноги от одной, руки от другой, сиськи от третьей?

как вообще там задаётся анимация?

что такое preconditioners и препроцессоры в COLLADA?

и что мешает этот COLLADA XML грузить не через C++-шный DOM, а через свой SXML загрузчик, добавляя атрибуты по вкусу и рассчитывая параметрические модели?

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

ты бы их загрузил, эти .dae в текстовый редактор, да посмотрел, что именно там написано в этом XML

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

http://www.gameenginebook.com/gdc09-statescripting-uncharted2.pdf

danl-slides.pdf

занятно. на 65 странице про uncharted2.pdf — диаграмма последовательности UML, про которую так распинался борщеархитектор.

просто, наглядно.

а ведь можно ещё и с системой Interactive Fiction авторинга скрестить, вроде AdvSys

и встроить распознаватель естественного языка, NLP парсер.

на странице 157 про uncharted2.pdf — вкратце требования к игор движку, как нужно встраивать скрипто движок *правильно*

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

диаграмма последовательности UML, про которую так распинался борщеархитектор

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

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

занятно. на 65 странице про uncharted2.pdf — диаграмма последовательности UML

Это, кстати, не UML. Обычная иллюстрация.

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

ну да, по нотации — ещё не она. по сути, тоже самое. а человечков с пунктирными стрелочками можно при желании генерировать Skribilo на Guile / skribe на ракетке из того описания.

а то: моделеориентированный характер UML 2.0, кодогенерация во все поля, Xtend/Xtext и прочие DSL...

а простую конкретную реализацию, работающую програмку из такой UML картинки борщеархитекторы сгенерировать ни асиливают...

ну и к чему тогда весь этот пафос борщеархитектора — когда он такую простую вещь как исполняемую, программируемую документацию сделать не может? гы.

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

ну да, по нотации — ещё не она. по сути, тоже самое.

По сути любое «прямое» графическое отображение будет по сути тем же самым. Именно по-этому UML и не нужно.

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

Ну ты баран! Тебе ж говорили про UML на бумаге! Слабо придумать более лучшую нотацию, которую карандашом чиркать было бы удобно? Насрать всем на твою «исполнимую документацию», оно тут вообще не в тему.

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

По сути любое «прямое» графическое отображение будет по сути тем же самым.

Я вообще по DSL все прекрасно прочитал, а в эти квадраты со стрелками на иллюстрации так и не врубился.

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

Слабо придумать более лучшую нотацию, которую карандашом чиркать было бы удобно?

Ну и нафига, если можно описать сразу на DSL?

anonymous
()

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

О них можно долго спорить в интернете. Вообще лисп этим и хорош.

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

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

Очень странно такое говорить про самый популярный в мире язык. Вон даже в Дельфи есть макросы, и вроде бы даже более удобные, чем в Лиспе. Хотя, я даже не знаю, какие они, так как ни разу не пробывал. Извеняюсь, если что-то вдруг не так. С наступающим Новым годом и Рождеством Христовым!

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

не корми его, на ЛОРе и так уже от обжорства лиспом помер не один тролль... совсем изведутся.

yyk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.