LINUX.ORG.RU

Allegro CL 9.0 Free Express Edition стал доступен для загрузки

 ,


9

10

Для загрузки на попробовать стала доступна версия коммерческой реализации языка программирования Common Lisp — Allegro CL 9.0 Express Edition.

Доступны пакеты для:

  • Linux (glibc 2.11 или позже);
  • Mac OS X (10.6 или позже), включает поддержку Lion;
  • FreeBSD (8.2 или позже);
  • Windows (XP, Vista, 7, 8, Server).

Основные новшества и изменения в этой версии:

  • полная поддержка SMP;
  • 820 исправлений и улучшений с последнего релиза;
  • полностью обновлен AllegroServe — вебсервер Franz Inc., написанный на лиспе: автоматическая компрессия/декомпрессия файлов, поддержка chunking, новый выбор опций безопасности, включая TLS v1.0 (также известный как SSL v3.1) протокол для защищенных соединений;
  • улучшена интеграция с Java через модуль jLinker, улучшен протокол, стал проще API;
  • новая и значительно упрощенная инсталляция для графических утилит на Mac 64-бит.

>>> Загрузка

★★

Проверено: anonymous_incognito ()
Последнее исправление: tazhate (всего исправлений: 4)

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

В п...у эти операционные системы, давай лучше бухать!

За Обаму что ли голосовал?

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

Ну они-то не написали «красиво макросом».

Так это же схемщики, они не могут в нормальные макросы из-за анальной гигиены.

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

Нужны простые, компактные, красивые языки. Такие, как Java, Python, ECMAScript.

красивые
Python

Ну кому и кобыла невеста.

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

Если бы это был кука, то писал бы из под куки.

Да он это. Кто ж еще физикам в CERNе рассказывает про UML, XML и Tomcat?

И да, кука ничем не интересен.

Как и весь этот тред.

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

Так это же схемщики, они не могут в нормальные макросы из-за анальной гигиены.

«нормальные макросы» - это когда реализация какого-нибудь примитивного loop занимает 10000 строк кода вместо 200, да еще и глючит при этом? Спасибо, не надо. Мы уж лучше как-нибудь с гигиеной - чтобы и писать меньше, и код понятнее, и работало все искаробки, без анальной акробатики.

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

«нормальные макросы» - это когда реализация какого-нибудь примитивного loop занимает 10000 строк кода вместо 200, да еще и глючит при этом?

10000000, чего уж там. И работает только по вторникам. П*деть - так по-настоящему.

и работало все искаробки

Чтобы работало только то, что есть искаробки, ты хотел сказать.

без анальной акробатики.

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

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

Да он это.

Они все одинаковые. Сидят же все на одном чане, друг другу рассказывают байки, как с родного колхоза в Москву попасть, джабу выучив. Короче, старая как мира история девачки, едущей покорять столицу.

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

Успокойтесь, оба неправы. Говномакросы вредны и опасны в любом виде и в любой форме, хоть с гиеной, хоть без. Только очень тупые и ленивые разработчики языков предлагают пользователям макросы (чтоб за них их работу сделали) вместо того, чтобы с самого начала включить в язык все нужные конструкции, раз и навсегда.

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

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

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

Потому что «не нужно».

Браво! А теперь сделай следующий шаг и осознай, что говнолишп вообще весь не нужен.

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

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

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

Сгинь, ничтожество, тут только-только интересный техносрач пошёл.

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

10000000, чего уж там.

Ну не 10000, а сколько там? Несколько тысяч строк точно есть. Разница на порядок.

И работает только по вторникам.

Нет, не по вторникам, но во многих случаях общелисповая реализация loop вместо корректного сообщения об ошибке выдает простыню раскрытого кода, в которой ищи свищи. Это, коненчо, не говоря о том, что гигиены в общелиспе нет, а значит любой макрос (в том числе и loop) легко и ненавязчиво ломается переопределением какой-нибудь внутренней переменной в контексте использования.

Чтобы работало только то, что есть искаробки, ты хотел сказать.

Почему же? Т.к. гигиеническая макросистема является строгим НАДмножеством негигиенической, то все что можно сделать в негигиенической можно сделать и с гигиенической. Обратное неверно, конечно.

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

Если вдруг гигиену надо обойти - то это делается легко и просто, проблема только вот в том, что добавить гигиену в когда она нужна в негигиенической системы принципиалньо невозможно. А посколько нужна она в 99% мест, тонутыпонелда - любой макрос в общелиспе превращается в неясную кучу блевотного кода, который все равно течет. Что и подтерждает упомянутый loop, да и вообще любой сложный макрос общелиспа, который на нормальную макросистему переписывается с уменьшением сорцев на порядок, при этом еще и с большей функциональностью.

Другое дело, конечно, если ты пишешь примитивные макросы-однострочники (как в сишки) - именно для таких задач предназначен препроцессор общелиспа и тут он не сильно проигрывает полноценным макросистемам.

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

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

Ага, сперва включить одни инструкции раз и навсегда, потом другие инструкции раз и навсегда, потом третьи - и так до тех пор пока не получится монстр вроде си плас плас, но и тогда останавливаться не следует. Замечательный пример такого подхода хаскиль например с его бесконечными расширениями. Естественно, чтобы получить эти расширения надо ждать пока их реализуют, отладят, выпустят новую версию канпелятора (возможно с нарушением обратной совместимости). Все это вместо того, чтобы в соответствии с принципом «keep it simple» реализовать макросы и не множить сущности без необходимости.

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

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

А лисперы не пользователи, они сами разработчики языков.

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

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

Давай начинай! Время пошло! И что бы все были довольны!

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

Почему же? Т.к. гигиеническая макросистема является строгим НАДмножеством негигиенической, то все что можно сделать в негигиенической можно сделать и с гигиенической. Обратное неверно, конечно.

Приведите, пожалуйста, пример того, что можно легко сделать в гигиенической системе, но на практике очень сложно или невозможно сделать с defmacro. Почему вы считаете гигиенические системы строго более мощными? Мне очень интересен этот вопрос.

Простой вид полезных на практике макросов:

  ;;; Paul Graham, On Lisp, p191
  (defmacro aif (test-form then-form &optional else-form)
    `(let ((it ,test-form))
       (if it ,then-form ,else-form)))

Реализуйте мне такой макрос на syntax-case из R6RS. У меня проще не получилось.

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

Сам я не готов делать резких заявлений на эту тему, т.к. пребываю в сомнениях. Признаю, что смысл в гигиенических макросах есть, но зачастую на практике, вместо решения прикладных проблем, начинаю бороться с этим сложным для меня инструментом, а иногда даже сдаюсь и откатываюсь на define-macro в Racket. Возможно, мне просто недостаёт опыта, но гигиенические системы пока кажутся мне слишком сложным инструментом. Поэтому меня удивляет, когда люди в интернете назвают их «более фундаментальными». Мне в некоторых отношениях даже с Camlp4 проще работать, чем с syntax-case. Ключевой момент — интуитивная понятность. Возможно, что до гигиены я просто ещё не дорос.

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

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

Что значит «принципиально»?

Про реализацию гигиены поверх мощной негигиенической макросистемы:

http://www.p-cos.net/documents/hygiene.pdf

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

Браво! А теперь сделай следующий шаг и осознай, что говнолишп вообще весь не нужен.

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

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

А в чем заключалась сложность работы? Хотетелось бы определить идеальную проблемную область которую хорошо решает лисп.

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

Почему же? Т.к. гигиеническая макросистема является строгим НАДмножеством негигиенической

Макросистема CL и так эквивалентна машине Тьюринга.

Другое дело, конечно, если ты пишешь примитивные макросы-однострочники

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

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

Хотетелось бы определить идеальную проблемную область которую хорошо решает лисп.

Компиляторы DSL.

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

проблемную область которую хорошо решает лисп

возьми любую где есть уже используют ЯП с динамической системой типов ( то есть почти любую). делай табличку - сравнение с другими используемыми там ЯП.

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

А посколько нужна она в 99% мест, тонутыпонелда - любой макрос в общелиспе превращается в неясную кучу блевотного кода, который все равно течет. Что и подтерждает упомянутый loop, да и вообще любой сложный макрос общелиспа, который на нормальную макросистему переписывается с уменьшением сорцев на порядок, при этом еще и с большей функциональностью.

Зачем писать большие и сложные макросы? Нужно создавать простые, надёжные кирпичики и комбинировать их. Если макрос простой и маленький, то сложных ошибок в нём не будет, а простые тестами выявятся. loop — очень плохой макрос (в т.ч. и интерфейс у него блевотный).

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

Почему же? Т.к. гигиеническая макросистема является строгим НАДмножеством негигиенической, то все что можно сделать в негигиенической можно сделать и с гигиенической. Обратное неверно, конечно.

Вранье. Нагенери эти самые c[a|d]*r функции гигиеническими макросами.

Это, коненчо, не говоря о том, что гигиены в общелиспе нет, а значит любой макрос (в том числе и loop) легко и ненавязчиво ломается переопределением какой-нибудь внутренней переменной в контексте использования.

Вранье. gensym все решает.

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

Хотетелось бы определить идеальную проблемную область которую хорошо решает лисп.

Да практически любую, от хеллоуволдов до супер-сложных-систем.

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

Только вот все используемые в индустрии DSL написаны НЕ на говнолиспе. Maven там всякий, ORMы разные, регэкспы, xslt и тому подобное - нигде там говнолиспом не воняет.

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

Только вот все используемые в индустрии DSL написаны НЕ на говнолиспе. Maven там всякий, ORMы разные, регэкспы, xslt и тому подобное - нигде там говнолиспом не воняет.

там воняет жабой

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

Только вот все используемые в индустрии DSL написаны НЕ на говнолиспе. Maven там всякий, ORMы разные, регэкспы, xslt и тому подобное - нигде там говнолиспом не воняет.

Это всё DSL широкого профиля. А часто DSL имеют настолько узкую функциональность, что кроме разработчиков конкретной программы никто про них не знает. И это при том, что в софтине сотни, тысячи таких DSL. Сотня лисповских макросов — сотня языков, которые лисп позволяет комбинировать.

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

Вот за это говнолисперов и близко не подпускают к индустрии.

Вот за это лисперов и близко не подпускают к говноиндустрии.

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

Только вот все используемые в индустрии DSL написаны НЕ на говнолиспе.

Жаба-кодинг - это не индустрия. Серьезная индустрия вообще вся на самопальных говноязычках держится.

Maven там всякий, ORMы разные, регэкспы, xslt и тому подобное - нигде там говнолиспом не воняет.

Ой, а зачем это всё? Куда же делась всемогущая Джаба со всеми необходимыми инструкциями? Что не хватило инструкций? Не шмогла?

На то они и жаба-кодеры, что кроме жабы ничего не знают, очевидно же.

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

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

Ну чтобы определить что надмножество а что подмножество, то все очень просто. Давай возьмем гигиеническую систему и попробуем написать defmacro - это будет очень просто, примерно так:

(define-syntax-rule (defmacro (name args ...) body ...)
  (define-syntax (name stx)
    (define (helper args ...) body ...)
    (syntax-case stx ()
      [(_ args ...) (datum->syntax stx (apply helper (syntax->datum #'(args ...))))])))
И вот у нас есть обычный негигиенический defmacro. Теперь попытаетмся написать при помощи defmacro define-syntax - и у нас ничего не выйдет. Потому чот defmacro в общелиспе оперирует списками, а define-syntax - синтаксическими объекитами, которые содержат информацию о лексическом контексте, биндингах, source location и т.д., другими словами, чтобы сделать define-syntax нам надо полностью переписать экспандер, то есть переделать макросистему.

Простой вид полезных на практике макросов:

Вот это кстати замечательный пример. На defmacro нельзя написать анафорические макросы - тот же aif. С гигиеной у нас все просто, тупо пишем:

(define-simple-macro (aif test-form then-form else-form)
  #:with it (syntax-local-introduce #'it)
  (let ([it test-form])
    (if it then-form else-form)))
и вот у нас работающий гигиенический макрос. без гиигены возникают проблемы - макрос-то вроде написан, но его нельзя использовать при написании других макросов! то есть в моей гигиенической реализации я могу написать вот такой макрос:
(define-syntax-rule (yoba x)
  (aif (+ x 1) x it))
а в твоей общелисповой уже не могу. почему? а ответ простой. Допустим, некто решил использовать мой макрос yoba. Естественно, он не знает и знать не должен, какова реализация и как yoba раскрывается. В частности, он не знает (и знать не должен) что там используется aif и it. И тут этот человек использует нечто вроде:
(let ([it 3]) (yoba it))
ну или же еще более смешной вариант, он использует тот самый aif и в нем yoba:
(aif 3 (yoba it) 0)
т.к. человек применявший yoba ни в первом ни во втором случае не знает экспанда этого макроса он не ожидает, ожидать не может и ожидать не должен, что этот макрос чего-то там перекроет. А значит, он полагает, что (display it) выведет 3 (ведь именно таково, по его мнению, значение it). В гигиенической реализации именно так и происходит, а вот в общелиспе не тут-то было! И в общелиспе эта проблема нерешаема. По-этому полноценные анафорические макросы в общелиспе не напишешь - гигиены нет. Для анафорических макросов обязательна гигиена.

Естественно пример тут приведен чисто умозрительный, реально никому не нужно писать макрос yoba, например. Но если у нас макросы раскрываются в макросы раскрывающиеся в макросы - то такая ситуация вполне возможна и она реально встречается. А когда макрос более сложен (aif-то примитив) то все значительно усложняется. Короче, чем сложнее макрос, тем больше выгод от гигиены.

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

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

Дело не только в гигиене а еще в том, в синтаксических объектах, фазах, поддержки рантаймом, библиотеках и т.д.. Я просто однажды для тренировки написал за вечер на коленке тот самый общелисповый loop - реализация заняла на порядок меньше кода, чем в общелиспе, код был понятнее, при чем лучше обрабатывал ошибки и обладал большей функциональностью (макрос был расширяем). На этом вопрос того какие макросы «круче» был для меня закрыт однозначно.

Что значит «принципиально»?

Ну значит никак нельзя, невозможно.

Про реализацию гигиены поверх мощной негигиенической макросистемы:

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

(define-syntax-rule (yoba x y) 
  (+ x y))

(let ([+ -])
  (yoba 1 1))
с гигиеной результат будет 2, без гигиены - 0. Для решения этой проблемы в коммон лиспе нагородили кучу всего - от пекеджей до lisp-2, но даже в комплексе эти средства проблему не решают, а лишь пытаются замести ее под ковер.

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

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

Макросистема CL и так эквивалентна машине Тьюринга.

«макросистема» плюсов тоже эквивалентна машине Тьюринга.

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

Что еще за чудо-система макротипов и при чем тут работа компиляторов в части АСТ? Смысл макросистемы как раз именно в том и состоит, чтобы вместо написания компилятора или его части реиспользовать уже существующие части языкового рантайма.

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

Зачем писать большие и сложные макросы? Нужно создавать простые, надёжные кирпичики и комбинировать их

Естественно, подразумевается, что у нас не один единственный макрос, в котором полотнища кода, а целая библиотека макросов, тот самый единственный макрос может выступать в роли, возможно, интерфейса. Собственно, гигиена именно и предназначена для того, чтобы увеличить композабельность макросов и снять с программиста бОльшую часть забот (на самом деле один большой простынный макрос написать проще чем несколько эквивалентных взаимодействующих «кирпичиков»). Надо отметить, что даже в случае гигиены, которая берет на себя почти всю работу, контроль за взаимодействием макросов иногда весьма сложен. Без гигены задача неподъемна даже в простейших случаях.

loop — очень плохой макрос

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

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

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

Я подожду, когда они proposal выкатят.

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

А в чем заключалась сложность работы? Хотетелось бы определить идеальную проблемную область которую хорошо решает лисп.

Да лисп-то для принципиальной возможности решения задачи пофиг. Просто плохие программисты выбирают Java. Ну или что там щас модно и высокооплачиваемо.

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

Хотетелось бы определить идеальную проблемную область которую хорошо решает лисп.

Используй поиск по форуму.

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

ну или же еще более смешной вариант, он использует тот самый aif и в нем yoba: (aif 3 (yoba it) 0)

Развернётся в let ... if, в котором для вычисления it будет использоваться предыдущий биндинг it.

В общелиспе часто используются if-let, где биндинги поимённые создаются.

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

Спасибо за интересный ответ.

Ну чтобы определить что надмножество а что подмножество, то все очень просто. Давай возьмем гигиеническую систему и попробуем написать defmacro - это будет очень просто, примерно так:

(define-syntax-rule (defmacro (name args ...) body ...) (define-syntax (name stx) (define (helper args ...) body ...) (syntax-case stx () [(_ args ...) (datum->syntax stx (apply helper (syntax->datum #'(args ...))))])))

И вот у нас есть обычный негигиенический defmacro. Теперь попытаетмся написать при помощи defmacro define-syntax - и у нас ничего не выйдет. Потому чот defmacro в общелиспе оперирует списками, а define-syntax - синтаксическими объекитами, которые содержат информацию о лексическом контексте, биндингах, source location и т.д., другими словами, чтобы сделать define-syntax нам надо полностью переписать экспандер, то есть переделать макросистему.

Согласен, defmacro тривиально реализуется поверх syntax-case.

Согласен также, что syntax-case реализуется поверх defmacro только путём написания своего макроэкспандера. Не уверен, насколько это сложно (нужно будет пропихивать лексический контекст в каждый макрос). Возможно, что это не очень сложно (скажем, 1000 строк и неделька работы), но да, намного сложнее реализации defmacro поверх syntax-case.

Я понял ваш критерий. Просто и понятно.

Попробуем зайти с другой стороны: представьте, что вы пишете компилятор лиспа. Нет ещё никакой гигиены, нет никакого defmacro. Что вначале реализуете — defmacro, а поверх гигиену, или сначала гигиену (уже сложнее, т.к. у нас нет даже самых тупых макросов), а потом уже defmacro в 5 строк?

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

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

Потому чот defmacro в общелиспе оперирует списками, а define-syntax - синтаксическими объекитами, которые содержат информацию о лексическом контексте, биндингах, source location и т.д.,

А можно привести пример использования лексического контекста, биндингов и source location в гигиеничесом макросе? Ну или хотя бы объяснить, что в макросе понимается под лексическим контекстом, откуда на стадии макроэскандинга взялись биндинги (информация из рантайма, в общем-то), и что делать с source location, если в следующей форме есть макрос, который этот самый source перекроит? Не то, чтобы я скептически был настроен, просто на самом деле интересно послушать :)

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

Вранье. Нагенери эти самые c[a|d]*r функции гигиеническими макросами.

(define-simple-macro (helper path ...)
  #:do [(define p (for/list ([x (syntax->datum #'(path ...))])
                    (case x [(car) #\a] [(cdr) #\d])))] 
  #:with name (syntax-local-introduce (datum->syntax #'this (string->symbol (list->string `(#\c ,@p #\r)))))
  (define (name lst) (helper2 (path ...) lst)))

(define-syntax (helper2 stx)
  (syntax-parse stx
    [(_ () lst) #'lst]
    [(_ (f ... l) lst) #'(helper2 (f ...) (l lst))]))

(begin-for-syntax
  (define-simple-macro (paths lst ...)
    #:with (id ...) (generate-temporaries #'(lst ...)) 
    (for*/list ([id lst] ...) (list id ...))))

(define-simple-macro (gen)
  #:do [(define p (list #'car #'cdr))]
  #:with (((car-cdr ...) ...) ...) (list (paths p p) (paths p p p) (paths p p p p))
  (begin (helper car-cdr ...) ... ...))

Вранье. gensym все решает.

При чем тут генсим? 99% мест где нужна гигиена генсимом не покрываются. (define-syntax-rule (yoba x y) (+ x y)) - давай попробуй с генсимом гарантировать, что никто не переопределит + в области вызовы yoba.

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

Вот это кстати замечательный пример. На defmacro нельзя написать анафорические макросы - тот же aif. С гигиеной у нас все просто, тупо пишем:

Не совсем тупо. Нужно знать про всякие syntax-local-introduce и ворох других трансформеров. А с defmacro нужно знать только про цитирования и антицитирования, ну и уметь обходить опасные случаи при помощи всяких gensym.

Но пример хороший. У меня какой-то совсем сложный aif получился, даже показывать не хочу :-) Это из-за недостатка опыта.

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

Ясно. Гигиена такого рода позволяет обеспечить модульность, без которой сильно усложняется комбинация dsl. В Racket это хорошо демонстрируется. Но меня интересует — во всех ли случаях имеет смысл использовать гигиену? Мне сложно работать с ней, думать больно много приходится. А хочется быстро и грязно и рука сама тянется к defmacro, возможностей которого во многих случаях хватает (хотя, конечно, на грабли наступать приходилось).

mrm
()
Ответ на: комментарий от anonymous
(define-simple-macro (helper path ...)
  #:do [(define p (for/list ([x (syntax->datum #'(path ...))])
                    (case x [(car) #\a] [(cdr) #\d])))] 
  #:with name (syntax-local-introduce (datum->syntax #'this (string->symbol (list->string `(#\c ,@p #\r)))))
  (define (name lst) (helper2 (path ...) lst)))

(define-syntax (helper2 stx)
  (syntax-parse stx
    [(_ () lst) #'lst]
    [(_ (f ... l) lst) #'(helper2 (f ...) (l lst))]))

(begin-for-syntax
  (define-simple-macro (paths lst ...)
    #:with (id ...) (generate-temporaries #'(lst ...)) 
    (for*/list ([id lst] ...) (list id ...))))

(define-simple-macro (gen)
  #:do [(define p (list #'car #'cdr))]
  #:with (((car-cdr ...) ...) ...) (list (paths p p) (paths p p p) (paths p p p p))
  (begin (helper car-cdr ...) ... ...))

сравниваем с:

(defmacro car-n (n)
  (let ((fname (intern (string-upcase (format nil "~:r" n)))))
    `(defun ,fname (s)
       (car
        ,(do ((i 0 (incf i)) 
              (res 's (list 'cdr res)))
             ((= i (1- n)) res))))))

даже не знаю что тут говорить, хуже гигены в лиспе только хаскель.

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