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)

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

А, т.е. герои на лисп-экскаваторах — пиздаты и всемогущи, но этот Жалкий Мир™ устроен так, что не дает им шансов?

Типичная отмазка неудачников.

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

API как раз есть.

Нету нормального АПИ для инструментирования.

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

Ну так речь о том, что никто не мешает ко всем фреймам прикреплять текущее продолжение (через continuation marks) и предоставлять доступ ко всем продолжениям по стеку вверх при исключительной ситуации.

По факту-то код в отладчике так и инструментируется - каждая форма в байткоде оборачивается в with-continuation-mark и добавляется отладочная инфа, которую отладчик и ловит. Для захвата и добавления туда текущего продолжения надо только добавить к этой форме лишнюю mark.

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

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

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

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

зачем нужен UML?

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

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

Ну я и говорю - ничего сложнее факториалов ты никогда не писал. UML - это, например, timing diagram. Тебе известен более адекватный и более domain specific способ описания процессов со сложными зависимостями?

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

Так и запишем: с UML не знаком.

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

Впрочем, лисперам не привыкать.

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

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

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

Тебе известен более адекватный и более domain specific способ описания процессов со сложными зависимостями?

Описание должно иметь под собой какую-то цель. UML этого не предполагает - это описание ради описания, из которого ничего нельзя получить.

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

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

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

UML этого не предполагает - это описание ради описания, из которого ничего нельзя получить.

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

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

По чертежу здания или по схеме можно понять, что за здание/схема и собственно сделать здание/схему. Из UML - нельзя

Разумеется, тебе не понять. Потому что ты не владеешь нотацией UML.

это совершенно бесполезный кусок хуйни.

Так и запишем. «Лиспер не осилил ХХХ => XXX есть совершенно бесполезный кусок хуйни». Что еще внести в этот список?

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

Лиспер, не понимающий, что такое абстракция. Как это типично!

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

А линейная алгебра-то тут при чем? Не, понятно, конечно же, что в наиболее низкопробных заборопокрасочных ПТУ для простоты объединяют курс аналитической геометрии с курсом линейной алгебры. В еще более убогих заведениях еще дальше идут, и читают один единственный поверхностный курс «высшая математика» (и по употреблению этого нелепого словосочетания выпускников заборопокрасочных отстойников как раз очень легко детектировать).

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

... и геометрия.

математика едина, сорт оф.

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

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

Аналитическая геометрия и линейная алгебра вообще практически никак друг с другом не связаны. Разные языки, разные методы, разные уровни абстракции.

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

Потому что ты не владеешь нотацией UML.

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

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

Разные языки, разные методы

Метод один. Разный предмет изучения.

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

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

Равно как и для нахождения ориентированых объемов.

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

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

ты тупой Борщ? а CAS тогда что? от Математики до Редьюса?

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

Тебе известен более адекватный и более domain specific способ описания процессов со сложными зависимостями?

Конечно, OWL(RDF). И в отличии от твоих «рисунков» это позволяет задавать спецификации вопросы и делать её непротиворечивой.

Но ты Борщ не учился ничему...

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

И в отличии от твоих «рисунков» это позволяет задавать спецификации вопросы и делать её непротиворечивой.

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

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

CAS? Это типа GiNaC на C++ и Mathematica на Mathematica (почитай, что сам Вольфрам про твой говнолисп писал)? Ну да, там говнолиспу не место, согласен. А где ему место?

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

Как это будет на Lua и Python?

(state ("shake-hands")
  (on (begin)
   (track ("player"))
     [wait-move-to "player" "waypoint7"]
     [signal "player-at-waypoint"]
     [wait-for-signal "sully-at-waypoint"]
     [wait-animate "player" "shake-sullys-hand"]
   )
   (track ("sullivan"))
     [wait-move-to "sullivan" "waypoint7"]
     [signal "sully-at-waypoint"]
     [wait-for-signal "player-at-waypoint"]
     [wait-animate "sullivan" "shake-drakes-hand"]
    ) 
  )
)
anonymous
()
Ответ на: комментарий от anonymous

В геймплее, анимации, эффектах, звуке и диалогах.

О'кей, так и запишем: лисп --- скриптовой язычок для игорь. Наконец-то нашел свое место, спустя 55 лет существования-то.

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

Зато гарантируется, что не будут проебаны необходимые сайд-эффекты окружения и тест будет реально тестом

Если в тесте сайд-эффект «прочитать 100Кб сетевого трафика», а потом полученное парсить, то как раз сохранение/восстановление образа мне гарантирует воспроизводимость, а повтор репла даст другие 100Кб трафика.

Твой аргумент против сохранения образа всё равно, что аргумент виндузятников против сохранения core-файлов. «Повтори те же действия и упадёт также, зачем core создавать и потом отладчиком в нём ковыряться?». А то что воспроизводимость для сетевых программ, гуя, многопоточных программ очень неважная, так пофиг.

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

По факту-то код в отладчике так и инструментируется

Да знаю я... но отладчика готового и работающего нет. А писать всё с нуля, боюсь, не справлюсь. Может возьмешься? Хоть отдельный, хоть для DrRacket, хоть для geiser.

Чтобы можно было выполнять любые команды, читать структуры (а не их отображение в текст вида "(1 5 8 69 ...)").

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

Да знаю я... но отладчика готового и работающего нет. А писать всё с нуля, боюсь, не справлюсь. Может возьмешься? Хоть отдельный, хоть для DrRacket, хоть для geiser.

Для нормального инструментирования нужны полноценные спеки байткода, я не знаю где их взять. Лучшее, что находил - это довольно общего характера paper по устройству racket vm и на маиллисте ничего лучше не предлагалось. Видимо, их нет в природе.

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

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

О'кей, так и запишем: лисп --- скриптовой язычок для игорь.

Ну так мозгой пошевели, «паттерн» узри, где это еще может использоваться. В Википедию до сих пор не сбегал, про DSL не почитал?

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

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

Борщ, ты тупой идиот неспособный научится ни чему (что собственно и вытекает из твоего неосиляторства учёбы в ВУЗе). Онтологии как раз и придуманы, что бы корректно (и логически целостно в отличии от твоего гуано) описывать новые предметные области.

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

Или 12ю главу здесь http://aima.cs.berkeley.edu/

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

Для нормального инструментирования нужны полноценные спеки байткода

Зачем?? Для нормального дебаггера достаточно к тому, что уже есть в DrRacket прикрутить выполнение произвольного кода и написать (inspect ...) из CL.

Весь дебаггер написан на вполне официальном API (continuation-mark + inspector). Не надо никаких хаков.

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

что бы корректно (и логически целостно в отличии от твоего гуано)

До корректно и логически целостно, недоумок, тебе еще дойти надо. А для этого тебе надо информацию всю извлечь из мутной и бессистемной помойки (требований заказчика, например). И для этого и нужны неформальные языки - mind maps, UML, и тому подобное. Потом уже хуярь свои онтологии, если без них не можешь, но этап анализа и проектирования ты сольешь грязно, если сразу начнешь онтологии надрачивать.

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

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

ты тупая обезьянка Борщ :) онтологии временами пишет целая толпа народа в многопользовательском режиме. их собственно и придумали что бы не решать задачи о «пяти красных взаимоперпендикулярных линиях, одна из которых зеленая» :)

но ты рисуй дятел :), тебя же рисовать наняли :) отрабатывай крутя педали :)

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

Попробуй это Вольфраму рассказать.

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

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

Попробуй это Вольфраму рассказать.

Это он что ли написал «New Kind of Science»? По-моему, он психически болен.

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

А еще он написал саму Mathematica и придумал язык. И если он говорит, что это не говнолисп, то это не говнолисп, точка.

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

Mathematica построена вся на term rewriting. Если бы ты сказал, что «у него получается мало отличающееся от Maude или Refal поделие», я бы согласился. Но говнолиспом там и не воняет.

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

Весь дебаггер написан на вполне официальном API (continuation-mark + inspector). Не надо никаких хаков.

Так она continuation-mark wrapper разве не на байткоде делает? Я думал на нем. Тогда ок, надо будет глянуть на досуге.

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

По факту Mathematics - лисп (синтаксически).

Синтаксически это ни хера не лисп, круглых скобочек нет. F[arg1, arg2, ...] не имеет ничего общего с (F arg1 arg2 ...).

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

Лисп он только в твоем больном воображении.

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

Синтаксически это ни хера не лисп, круглых скобочек нет. F[arg1, arg2, ...] не имеет ничего общего с (F arg1 arg2 ...).

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

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

Код представлен в виде АСТ из форм, каждая форма - список, голова - ф-я либо спецформа, хвост - аргументы.

Тогда и Си тоже Лисп, потому как AST сишечки точно так же представляется.

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

Тогда и Си тоже Лисп, потому как AST сишечки точно так же представляется.

В математике не АСТ так представляется, это код там по факту такой. Он там и есть АСТ - как в лишпе.

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

То, что в Математике есть средства для отображения кода в виде AST (и еще во многих других формах), еще не делает именно это представление основным и фундаментальным.

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