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)

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

Извини, не знал, что у тебя монополия.

ugoday ★★★★★
()

Лисперы и enterprise-архитекторы очень похожи. Нам нет нужды враждовать. И тем и другим просто лень писать код.

Пользователи других языков усердно кодируют ручками на клавиатуре. Лисперы заставляют кодировать Лисп. Enterprise-архитекторы заставляют кодировать пользователей других языков.

Только у enterprise-архитекторов есть один недостаток. Макросы у них биологические - работают через раз, еду клянчат и права качают.

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

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

Странные какие-то у тебя бульдозеры.

Работают на гелии-3. Рассчитаны только на работу в вакууме, на идеально ровной рабочей поверхности и при условии отсутствия силы трения. Панель управления состоит из сотни одинаковых неподписанных кнопок, руководство по эксплуатации занимает пять томов. Чтобы управлять машиной, нужно знание квантовой гравитации. Неудивительно, что при помощи таких подъёмных кранов и бульдозеров так ничего и не было построено.

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

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

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

Лол, в этом есть какая-то утончённая ирония — услышать подобную фразу из уст лиспера.

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

Разработчик:

  • разрабатывает программное обеспечение
  • написано: NNN KLOC
  • заработано: $$$

Лиспер:

  • строчит в бложике, какие разработчики смешные
  • написано: NNN постов в блоге, 0 KLOC
  • заработано: 0
anonymous
()
Ответ на: комментарий от anonymous

Разработчик:
разрабатывает программное обеспечение

Кстати, о ПО: сегодня отправили первый патч с недавней установки на продакшене. В CDR логах время с каждой сессии накапливалось с новым звонком, что было неправильно. Фикс был тривиален и был отправлен клиенту по мылу в виде FASL файла. Никто ничего не заметил при загрузке патча в работающее приложение, обслуживающее одновременно 300 звонков (на один инстанс), только CDR стали правильными ;-).

написано: NNN KLOC

tekila@devbox ~/projects/engine % cloc .                                                    
defined(%hash) is deprecated at /usr/bin/cloc line 1277.
	(Maybe you should just omit the defined()?)
     332 text files.
     324 unique files.                                          
     160 files ignored.

http://cloc.sourceforge.net v 1.53  T=1.0 s (172.0 files/s, 65215.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               60           4863           3295          24346
Lisp                            43           2939           1789          20137
C/C++ Header                    45           1028           1350           2550
Bourne Shell                    14            187            261           1152
XML                              4             29            104            331
Ruby                             1             52             12            321
XSD                              1              0              0            265
make                             3             49             25            109
awk                              1              5              5             11
-------------------------------------------------------------------------------
SUM:                           172           9152           6841          49222
-------------------------------------------------------------------------------

заработано: $$$

$ 162500.000

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

Странные какие-то у тебя бульдозеры.

Это не у меня. Это у строителей. И я таки жду адрес пирамиды, построенной с помощью современной строительной техники.

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

значит пора переходить к аргументации своих утверждений.

К аргументации чего? Утверждения что «гигиена обходится одной ф-й»? Ну так это действительно так, достаточно прочитать доки. Из всего кода хоть какое-то отношение к гигиене в моей реализации имеет только одна единственная строка.

define-syntax, define-marco и т.д.

Так это чтобы вместо кривой обфусцированной перл-параши был понятный и лаконичный код.

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

Представь себе - у меня все то же самое. В любом случае, даже если предположить, что твое решение чем-то лучше (что, ясно, не так, но мы _предположим_), у меня этот макрос хотя бы пишется. В отличии от aif, который в общелиспе не пишется принципе. Так что кто SOOSNOLEY становится очевидным.

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

https://picasaweb.google.com/lh/photo/snk65Gv5N6jeTM2Mfce4f_6i8a9ulCuTztlddz1...

Неплохо, но это, как видно, реализовано за счет средств иде? А как на счет языковых средств - то есть если запускать без дебага и без иде? Ну и «+» выделился вместо полного выражения, хотя эта неточность простительна, конечно.

Не подсвечивает. Короче, злобный обман это всё...

Ну зачем врать? http://s017.radikal.ru/i416/1211/79/96dd75b10c69.jpg

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

схема - лисп-1, а хочется сбоку макросы привесить, сделали гигиену, поскольку идиоматичные решения из лисп-2 крайне неудобны в лисп-1

Опять ты выходишь на связь со своими мокрыми фантазиями о связи лисп-1 и гигиены? Ну сколько можно уже хуету нести?

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

Неплохо, но это, как видно, реализовано за счет средств иде?

100%

А как на счет языковых средств - то есть если запускать без дебага и без иде?

Если eval через хук делать, то твоя функция на каждую форму вызывается. Но информации о source location в CL нет никакой. В штатном виде, по-крайней мере.

Ну зачем врать?

В менюшке Language ракеты не было (самое близкое по названию - LazyRacket). С #racket действительно подсвечивает.

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

Код одного проекта:

--------------------------------------------------------------------------------
Language                      files          blank        comment           code
--------------------------------------------------------------------------------
VHDL                           1261         111697         138640         842979
Bourne Shell                    169          16808          20475         106873
C                               267          11540          14958          57519
Lisp                            532           6884           3305          56225
m4                               12           3738            364          33782
Tcl/Tk                           68           2816           2945          14565
make                             62           2468           1688          13760
Python                           38           3004           4000          13505
C/C++ Header                    214           3177           7034          12950
HTML                             10            250              4           6690
D                                78           3083              0           4621
XML                               4              0              0           2757
Bourne Again Shell               40            237            106           1272
Java                              4            258            275            847
C++                               4            148            105            644
CSS                               5             65             25            437
Javascript                        3             28              8            284
Perl                              2             83             27            124
Objective C                       1             19             11             64
Assembly                          1             24             35             56
Teamcenter def                    1              1              0             16
awk                               1              0              0              8
Fortran 77                        4              0              0              7
--------------------------------------------------------------------------------
SUM:                           2781         166328         194005        1169985
--------------------------------------------------------------------------------
Скрипт много косяков выдал. Например, D и Java откуда-то взял.

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

Lisp                           1602          61217          64440         572773
VHDL                             32          11559           5474          86648
XML                              16            416            728          13474
Bourne Shell                    115           1276            460           6874
Очень много из VHDL'я сгенерировано лиспом или питоном (железячники генераторы бойлерплейта для себя на питоне писали, потом лисп освоили).

Денег заработало сильно больше, чем gensym привёл, но и потрачено лимонов под 10 зелени (18-слойные платы с дорожками из золота, FPGA по 10к за штуку...).

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

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

И на сколько снизится производительность с eval через хук? Кроме того, понятно, что в данном случае source location трейсится встроенным образом - то есть контроля со стороны макрописателя нет. А он нередко нужен - например, чтобы указать source выражения, сгенерированного внутри самого макроса. В общем, преимущество от наличия source перед его отсутствием для меня очевидно :)

А на счет лексической информации в рантайме, тут дело такое:

(let ()
  (struct yoba (x y))
  (match (yoba 1 2)
    [(yoba x y) (+ x y)]))
(код намеренно всунут внутрь let'a а не оставлен в топ-левеле) Здесь форма struct связывает во время экспанда с символом yoba статическую информацию о том, что это - структура, и что у нее есть соответствующие геттеры (они не обязательно будут yoba-x и yoba-y, по-этому нагенерить эти гетеры потом автоматически нельзя - только вытащить из статического yoba). match во время своего макрораскрытия проверяет, определено ли yoba как структура, потом вытаскивает из нее геттеры и генерирует с ними соответствующий код для паттерн-матчинга. Если бы yoba не было определено как структура - естественно, была бы ошибка во время экспанда. Все довольно легко реализуется (могу показать пруф-оф-концепт реализацию с объяснением), корректно работает в разных лексических контекстах, перекрывается и т.п.

Как подобную вещь реализовать в CL?

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

В менюшке Language ракеты не было (самое близкое по названию - LazyRacket). С #racket действительно подсвечивает.

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

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

И на сколько снизится производительность с eval через хук?

Не знаю, не проверял.

Как подобную вещь реализовать в CL?

Ты объясни, что твой код делает, и реализация какой именно вещи в CL интересует?

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

Ты объясни, что твой код делает, и реализация какой именно вещи в CL интересует?

Я же объяснил. struct добавляет во время экспанда в лексический контекст некоторую статическую информацию, match потом эту информацию во время экспанда использует. Можно ли в CL реализовать такой match? Более общо - можно ли (и если да - то как) экспандить макрос Ч в зависимости от экспанда некоего другого макроса Y? То есть как осуществлять взаимодействие между макросами во время экспанда? Вопрос важный, т.к. все интересные макросы завязаны на использование этой фичи. Без нее приходится писать кодеволкеры, но кодеволкеры не работают и за них бьют лицо.

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

Я же объяснил. struct добавляет во время экспанда в лексический контекст некоторую статическую информацию, match потом эту информацию во время экспанда использует. Можно ли в CL реализовать такой match? Более общо - можно ли (и если да - то как) экспандить макрос Ч в зависимости от экспанда некоего другого макроса Y? То есть как осуществлять взаимодействие между макросами во время экспанда? Вопрос важный, т.к. все интересные макросы завязаны на использование этой фичи. Без нее приходится писать кодеволкеры, но кодеволкеры не работают и за них бьют лицо.

Мне кажется, что нельзя, т.к. в CL порядок раскрытия макросов не специфицирован. Если бы он гарантированно «совпадал» с лексической вложенностью, то можно было бы передавать контекст через динамическую переменную, но сейчас я не вижу очевидного решения, кроме как подразумевающего написание кодволкера. И даже с кодволкерами было бы сложно реализовать макросы, зависящие одновременно друг от друга (в две стороны).

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

Кстати, в CLtL2 есть доступные из макросов окружения с информацией о лексическом контексте: https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node102.html . Эту фичу можно использовать в кодволкерах.

Дело не только в гигиене а еще в том, в синтаксических объектах, фазах, поддержки рантаймом, библиотеках и т.д..

Синтаксические объекты — это хорошо. Я не против новых возможностей, если эти новые возможности не отменяют старые. Система модулей, чёткое разделение на фазы в стиле MetaOCaml — это замечательно. Всё эти фичи позволяют не только использовать макросы в более агрессивном стиле, но и, как вы справедливо заметили, делать многие вещи, которые в CL делать сложно или совсем невозможно.

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

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

У defmacro предельно простая семантика. Это низкоуровневый инструмент, позволяющий делать маппинги из AST в AST на синтаксическом уровне. Что вижу в редакторе (S-выражения), то и мешу в макросах. Похожим образом в Tcl: вижу текст — мешу текст. Концептуально просто и интуитивно понятно.

Да, это опасный инструмент с известными проблемами, но его возможностей часто хватает.

Макросы Схемы же добавляют ещё один уровень сложности, заставляют использовать язык трансформеров для выражения таких вещей, которые выражаются и в базовом лиспе. Например, мне нужно знать одновременно про let и про syntax-local-introduce и не забывать отслеживать, в каких частях программы нужно использовать одну конструкцию, а в каких — другую.

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

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

Например, мне уже знакома семантика формы let в Scheme, и если мне понадобится ввести новые биндинги в макросе, то я, не долго думая, использую этот же let. Так же и в Camlp4: захотел новый биндинг — использовал let из базового языка. Тупо, просто, интуитивно понятно.

Если бы я писал библиотеки, предназначенные для использования другими людьми, то, не вопрос, использовал бы в интерфейсе только гигиеничные макросы; но себя мне лишний раз насиловать не хочется. Возможно, что просто юз-кейсы у меня настолько простые, что и с defmacro получается писать программы, которые не разваливаются и которые мне самому несложно дописывать. Если нужно быстро написать throw-away прототип, то и write-only perl style себе позволяю, со страшным, абсолютно нечитабельным месивом из defmacro и неправославным «пидорасиньем AST голыми руками».

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

Но этот инстумент не нарушает мой рабочий flow, т.к. в силу концептуальной простоты полностью загружается в оперативную человеческую память. Defmacro похож на мачете (простой и грубый инструмент, которого часто хватает для решения конкретных проблем), в отличие от макросов Racket, которые больше похожи на сложный (пусть и с хорошей инструкцией) швейцарский нож, с большим количеством неочевидных возможностей, изучение и (срочное) вспоминание которых запросто может меня из этого самого flow выбивать.

При этом опыт мне подсказывает, что нельзя делать скоропалительные выводы о концепциях, кажущихся неинтуитивными. Многие хорошие идеи часто кажутся интуитивно непонятными и неочевидными (собственно потому и не получают изначально широкого распространения). Поэтому я продолжу попытки освоения макросов Racket. Это ещё одна модель метапрограммирования, с которой мне хочется познакомиться поближе.

Если не секрет, зачем вы пишете всё это на linux.org.ru, да ещё и анонимно? Абстрактных монадических мужиков с lambda-the-ultimate подобное обсуждение заинтересовало бы как минимум не меньше, чем местную публику.

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

зачем вы пишете всё это на linux.org.ru, да ещё и анонимно?

Не слушай этого регистранта, анон, пиши на лоре. Это хорошее, полезное дело.

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

Я же объяснил. struct добавляет во время экспанда в лексический контекст некоторую статическую информацию, match потом эту информацию во время экспанда использует. Можно ли в CL реализовать такой match

Да, в лиспе можно добавлять некоторую информацию и потом её использовать.

Можно ли в CL реализовать такой match?

Я ещё раз повторю, что без понятия что это за «такой match».

Более общо - можно ли (и если да - то как) экспандить макрос Ч в зависимости от экспанда некоего другого макроса Y?

Конечно, можно. Макрос - это почти обычный лиспокод.

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

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

Я даже как-то не знаю, что тебе ответить.

За долгие годы употребления лора я столько всего повидал тут — мало что способно удивить меня. Так вот, у тебя получилось!

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

Я ещё раз повторю, что без понятия что это за «такой match».

Я выше подробно описал «что за такой». Хотя ваша попытка косить под дурочка сама овтечает на этот вопрос - нет, в Common Lisp это сделать нельзя.

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

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

Потому что кодеволкер должен работать исключительно на раскрытом коде (иначе будут ошибки). Но в таком случае что будет, если у нас макрос с кодеволкером внутри макроса с кодеволкером? В результате все это работает либо с большими ограничениями, либо глючит.

Кстати, в CLtL2 есть доступные из макросов окружения с информацией о лексическом контексте: https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node102.html .

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

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

Я уже говорил об этом. Если есть некое средство, которое предоставляет возможность для управления биндингами - то система с таким средством заведомо мощнее, чем система без такого средства. Далее вопрос лишь в том, как связываются переменные _по умолчанию_ - в месте вызова макроса или в месте определения. Это уже не влияет на мощность системы - лишь вопрос удобства. И логика там простая - раз практически все символы естественно связывать по месту объявления и лишь некоторые - по месту вызова, то естественно сделать так, чтобы по умолчанию связывание происходило по месту объявления. И мы получаем гигиену.

Что вижу в редакторе (S-выражения), то и мешу в макросах.

Надо сказать, что в схемах благодаря паттернам это проявляется лучше :)

Макросы Схемы же добавляют ещё один уровень сложности

Все совершенно наоборот. Они позволяют не думать о тех вещах, о которых надо думать в гигиенической системе (т.к. обо всем подумает гигиена). Компьютерное время дешевле человеческого. Если задача может быть эффективно решена на компьютере, то зачем ее решать руками? Пусть компьютер и решает. А человеку оставим задачи, которые компьютер решить не в состоянии (благо на всех хватит :)).

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

Гигиену мне приходится обходить всегда, когда нужно подцепить «неявно» биндинги из контеста раскрытия макроса, создать новые биндинги, сгенерировать макросы из макроса.

Обход гигиены в классическом макросе, который вводит биндинги, - это _одна_ строчка. Несколько сложнее может быть в случае написания реально сложного макроса, с реализацией эдак на 1kloc (не общелисповых, ясно, в общелиспе это было бы все 10kloc :))

Можно пару примеров _конкретных_ ваших макросов, где вам пришлось обходить гигиену и все это было чрезмерно неудобно (ну или где вы плюнули и переписали на дефмакро)?

Но этот инструмент не нарушает мой рабочий flow

Проблема просто в том, что первый инструмент вы освоили, а второй - осваивать не хотите. И не потому что он значительно сложнее, а потому что «ну я уже умею делать это при помощи инструмента Х, зачем мне нужен инструмент Y»? Естественно, использовать инструмент, который вы освоили, легче, чем инструмент, который вы не освоили. Но о качестве и реальном удобстве инструмента это ничего не говорит. Вот вам списки удобнее руками мапать разбирать и фолдить - меж тем паттернами все это делать намного удобнее и проще. Но вы особо не пробовали, вот и результат.

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

Для мения гигеническая система намного интуитивнее, чем негигиеническая. Действительно, гигиена respect to lexical structure of program - то есть работает согласовано с лексической структурой программы, а тело макроса «замыкается» на окружающий лексический контекст в точности как тело функции. С другой стороны, макросы в негигиенической системе ломают лексическую структуру, замыкаясь по своим особенным, уникальным правилам. Что проще? :)

Если не секрет, зачем вы пишете всё это на linux.org.ru, да ещё и анонимно?

Ну зашла речь о гигиене, почему бы не обсудить? Вот вам это, видимо, интересно - а мне объяснить не сложно. Польза от разговора очевидна, разве нет?

Абстрактных монадических мужиков с lambda-the-ultimate подобное обсуждение заинтересовало бы как минимум не меньше, чем местную публику.

На лямбде и мейнтейнеры Racket неплохо справляются :))

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

Не описал.

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

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

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

Гигиенические макросы бывают двух видов - сложные и реально сложные.

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

Гигиенические макросы бывают двух видов - сложные и реально сложные.

С чего ты взял?

Вот например пара простых макросов:

#lang racket
(require syntax/parse/define
         (for-syntax syntax/parse))

(begin-for-syntax
  (struct static-struct (getter-list constructor predicate)
    #:property prop:procedure (λ (this stx)
                                (with-syntax ([constr (static-struct-constructor this)])
                                  (syntax-parse stx
                                   [(_ args ...) #'(constr args ...)]
                                   [_ #'constr])))))

(define-simple-macro (my-struct name:id args:id ...)
  #:with n #`#,(length (syntax->list #'(args ...)))
  #:with (getters ...) (for/list ([i (in-range (syntax-e #'n))]) #`(λ (x) (vector-ref x #,i)))
  (begin (define (predicate x) (= n (vector-length x)))
         (define (constructor args ...) (vector args ...))
         (define-syntax name (static-struct (list #'getters ...) #'constructor #'predicate))))

(begin-for-syntax
  (define-syntax-class match-pattern
    (pattern ((~var name (static static-struct? "struct name")) args ...)
             #:do [(define static-inf (syntax-local-value #'name))]
             #:fail-unless (= (length (syntax->list #'(args ...))) (length (static-struct-getter-list static-inf)))
                           "wrong number of constructor's arguments"
             #:with predicate (static-struct-predicate static-inf)
             #:with (getters ...) (static-struct-getter-list static-inf)))
  (define-syntax-class match-clause
    (pattern [patt:match-pattern body:expr ...+]
             #:with predicate #'patt.predicate
             #:with (getters ...) #'(patt.getters ...)
             #:with (args ...) #'(patt.args ...))))

(define-simple-macro (my-match arg:expr clause:match-clause ...+)
  (let ([tmp arg])
    (cond [(clause.predicate tmp) 
           (let ([clause.args (clause.getters tmp)] ...)
             clause.body ...)] ...)))
(my-struct test x y z)
(my-match (test 1 2 3)
          [(test x y z) (+ x y z)])
->
6
Ну это в нормальной макро-системе они простые, а в общелиспе они будут реально сложными, да.

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

Стоит ли изучать С в купе с Erlang?

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

Ну это в нормальной макро-системе они простые, а в общелиспе они будут реально сложными, да.

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

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

Это все очень благородно, но вот что интересует.

В свое время ракетка благополучно вылетела из поля моего зрения благодаря, не в последнюю очередь, непоняткам со стандартами (R5RS vs R6RS и все против всех). А на сегодня что собой представляет ракетка и в каком направлении они развиваются?

Сейчас ты снова обратил мое внимание на эту платформу, и очень вовремя — мне предстоит интересная задача, но надо определиться с инструментами. И желательно, чтоб в ближайшие лет 5 не было неожиданностей.

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

Ну это в нормальной макро-системе они простые, а в общелиспе они будут реально сложными, да.

а ты сам-то можешь объяснить смысл своего примера, какую проблему решает твой код? (+ 1 2 3) и так будет 6 в CL, что в рантайме, что при макроэкспанде.

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

а ты сам-то можешь объяснить смысл своего примера, какую проблему решает твой код? (+ 1 2 3) и так будет 6 в CL, что в рантайме, что при макроэкспанде.

Это реализация паттерн-матчинга. Соответственно, он решает те проблемы, что решает паттерн-матчинг.

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

реально сложного макроса

в CL это просто ещё одна программа, обрабатывающая AST на стадии макроэкспанда.

И не потому что он значительно сложнее, а потому что «ну я уже умею делать это при помощи инструмента Х, зачем мне нужен инструмент Y»?

a) исходно гигиена решает только одну проблему - запрещает любую коллизию символов b) в лисп-2 из-за отдельного пространство для функций проблема стоит менее остро. c) в любом случае формы, переданные макросу биндятся к (gensym) чтобы избежать повторных вычислений.

где же реальная выгода гигиены?

Что проще

Произвольное преобразование AST -> AST, то есть CL.

а тело макроса «замыкается» на окружающий лексический контекст в точности как тело функции.

левое определение.

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

А на сегодня что собой представляет ракетка и в каком направлении они развиваются?

Это схема, сделанная правильно, с большим количеством батареек. При чем развитая макросистема, да и вообще инструментарий для запиливания и использования ДСЛей с полноценной поддержкой со стороны рантайма и ИДЕ считается одной из главных фич.

И желательно, чтоб в ближайшие лет 5 не было неожиданностей.

Какого рода неожиданностей?

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

Соответственно, он решает те проблемы, что решает паттерн-матчинг

В CL примитивно делается - обычная последовательность if-let. Даже без тонны сахара схемы кода будет реально мало.

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

в CL это просто ещё одна программа, обрабатывающая AST на стадии макроэкспанда.

В ракетке тоже. Вопрос в том, надо ли реализовывать все на низком уровне (как в общелиспе) или есть удобные высокоуровневые средства, которые упрощают решение, сокращают его и повышают надежность.

a) исходно гигиена решает только одну проблему - запрещает любую коллизию символов

Эта проблема _никак_ не связана с гигиеной.

b) в лисп-2 из-за отдельного пространство для функций проблема стоит менее остро.

лисп-2 тоже _никак_ не связан с этой прблемой.

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

Во-первых, формы переданные макросу вообще могут не быть выражениями, которые можно к чему-то забиндить, а во-вторых - при чем тут гигиена? Генсим - это где-то 1% всей гигиены. А остальные 99%?

где же реальная выгода гигиены?

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

Произвольное преобразование AST -> AST, то есть CL.

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

левое определение.

Это не левое определение, это и есть определение гигиены, дятел. Переменные замыкаются на область определения макроса aka «respect to lexical structure of program», как указано в стандарте той же схемы.

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

В CL примитивно делается - обычная последовательность if-let.

Ну так попробуй, лол.

Даже без тонны сахара схемы кода будет реально мало.

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

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

Ну так попробуй, лол.

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

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

есть удобные высокоуровневые средства, которые упрощают решение, сокращают его и повышают надежность

тут джава вне конкуренции.

Эта проблема _никак_ не связана с гигиеной.

да, да в твоём понимании гигиена - это синтаксический сахар схемы.

Это не левое определение, это и есть определение гигиены, дятел.

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

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

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

Да ты что? Ну так может ты его приведешь, с пруфами?

да, да в твоём понимании гигиена - это синтаксический сахар схемы.

Нет.

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