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

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

Тем, что вызывают разрыв пукана унылого борщехлеба-ононима.

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

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

Представь себе - это (описание геймплея, анимации, эффектов, звука, диалогов и т.д.) и составляет 90% любой реальной игры (если она не является наколеночной поделкой, конечно же).

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

Есть же стандартные force/delay

Кстати, да. Просто просили «то же самое», а в CL delay нету. Если честно, забыл.

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

То есть игровая логика, эффекты, звук, диалоги и т.д. написаны на racket и компилируются при помощи racket в код на плюсах.

При этом по твоей логике игра написана на плюсах (ведь кода на racket там нет!)

Тогда скажи пожалуйста, на чем написано ядро линукса? На машкоде? Ведь кода на сишке в ядре нет!

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

Таким образом, «язык предметной области» — это всего-навсего «typed Racket-ish code».

Это не typed racket. Это их собственный типизированный ДСЛ, синтаксически и семантически схожий с racket. На этом ДСЛ написаны геймплей, эффекты, звуки, диалоги, скрипты. Этот дсл при помощи racket компилируется в плюсы. Что тебе не понятно?

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

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

Там и кода на с++ нет.

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

Там и кода на с++ нет.

Ах, это я тоже хотел предъявить гуманитарному! Держал до последнего. Вот бы ржака бы была. :D

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

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

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

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

ерез REPL создал тестовую ситуацию, а потом надо перезагрузить компьютер.

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

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

Там есть 16 программистов, которые писали на движок на с++ и генератор данных (логики игры) на Racket (размер codebase неизвестен) + 20 дизайнеров и 100 artists & animators, которые писали на Racket (точнее, на специальном ДСЛ поверх Racket) - 120 мб кода.

Вопрос - на чем написана игра?

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

Он, кстати, на докладе говорил, что компиляторы DSL'ей обслуживают только два человека. Программисты Sony пишут всякую мелочевку, вроде GUI, на C#.

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

Там есть 16 программистов, которые писали на движок на с++ и генератор данных (логики игры) на Racket (размер codebase неизвестен) + 20 дизайнеров и 100 artists & animators, которые писали на Racket (точнее, на специальном ДСЛ поверх Racket) - 120 мб кода.

браво! всё просто в точку, но Борщ не ответит (как и всегда).

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

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

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

На Си, блядь, плюс блядь плюс!

На C++ написан только игровой движок, который как правило уже готовый используется. Мелочевка написана на C#. Весь же код, который и составляет игру, написан на DSL'ях.

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

Хватит называть контент «кодом».

Хватит называть код «контентом». Вот тебе пример кода:

(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

Игра чуть менее чем полностью состоит из этого «контента». Он, в частности, содержит игровую логику и скрипты.

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

Он не «написан»

что значит «не написан»? Именно что написан, на специальном ДСЛе. Что делали с текстом на этом ДСЛе - уже другой вопрос.

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

C точки зрения C++-кодера - это контент. Технический аниматор приносит вот такое описание C++-птушнику, и птушник пыхтит неделю, пишет это на C++.

В случае с DSL'ем на Лиспе - этот контент исполняемый. Аниматор тут же может его запустить и посмотреть результат. А C++-птушник в этом время будет заниматься своим прямым делом - подметать дворы.

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

То есть «декларативное описание» = «контент». Так что при использовании ДСЛ у тебя всегда будет получаться контент вместо кода. Решающий ту же задачу, что и код.

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

Этот у нас последний неслитый остался? Вряд ли он уже очухается.

Слив засчитан.

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

Я не дрочу на них, я их использую. ЧЯДНТ?

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

Я работаю над безумно интересными проектами. ЧЯДНТ?

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

Мне не приходится городить костыли. ЧЯДНТ?

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

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

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

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

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

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

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

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

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

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

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

Да ты же упоротый

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

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

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

finder34r
()

ТРИУМФ ЛИСПА

Итак, 2013 год — год триумфа лиспа! Спустя 55 лет существования лиспа, на нем написали скрипты для компьютерной игры! Это полный УСПЕХ лиспа! Рваные пердаки быдлокодеров повсюду! Джеймс Гослинг покончил с собой, приняв смертельную дозу кофе! Его примеру последовали Керниган, Страуструп и Ван Россум! Волна массовых самоубийств-подражаний среди программистов прокатилась по странам Старого и Нового света! Крупнейшие софтверные корпорации подали заявления о банкротстве! Мир больше не будет таким, как прежде, и в этом заслуга лиспа!!!

(Тут лиспер очнулся. На столе стояла остывшая тарелка борща...)

anonymous
()
Ответ на: ТРИУМФ ЛИСПА от anonymous

Гуманитарный, по сути темы появилось, что сказать?

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

anonymous
()

А о чем вообще тут сыр-бор?

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

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

Это че, прям дохуя достижение?

Для лиспа — да.

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

А о чем вообще тут сыр-бор?

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

anonymous
()
Ответ на: ТРИУМФ ЛИСПА от anonymous

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

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

тебе бы Беклемишева почитать

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

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

ну писать категории предметной области на лиспе проще простого.

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

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

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

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

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

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

У них просто апи нету нормального к отладчику.

API как раз есть. Готового дебаггера нету. Я могу сделать трейс любой сложности и извращённости, но если уже запущенная (типа в продакшен) программа внезапно упала в странном месте, то в SBCL я могу вытащить все подробности и при некоторой доле везения даже продолжить работу (перекомпилировав и запустив со следующей итерации). В Racket я должен заранее разложить нужные метки и обработчики прерываний иначе программа упадёт и всего лишь отрапортует о нарушении контракта.

С другой стороны из-за этого в программах на CL все «почти аварийные» ситуации в программах никак не обрабатываются. Например, обрыв соединения СУБД, нехватка места на диске, ... Зачем? Если есть дебаггер с интерактивной обработкой рестартов. Упадёт, так админ пусть решает: прервать/повторить/попытаться починить. И поэтому в Racket _не хотят_ делать нормальный отладчик. И даже тот что есть полностью отключается при обычной (не отладочной) компиляции.

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

Ильин, Позняк, «Аналитическая геометрия».

Намного более системное изложение, чем у вечного доцента Беклемишева.

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

Ну и почему герои на экскаваторах до сих пор не захватили мир, если дети с лопаточками им вообще не конкуренты?

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

Перезагрузил компьютер -> загрузил историю репла.

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

Или самая типовая ситуация: при обработке данных сетевого интерфейса что-то сработало не так и случилась ошибка.

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

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

Ильин, Позняк, «Аналитическая геометрия».

Спасибо, почитаю.

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

Да я не про софтинки, я про UML. Размазываешь ты говно по бумажке или по монитору - она и там и там говно.

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

Программист хеллоуорлдов, факториалов и чисел Фибоначчи не может понять, зачем нужен UML? И почему я не удивлен? Смешно, что именно эти люди что-то там визжат про «интересные и сложные задачи», вероятно, имея в виду те самые факториалы.

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