Здравствуйте, Аноним, Вы писали:
А>>>Таки defmacro реализуется в десяток строк на syntax-case. M>> Которого нет в стандарте. А>Забавно беседовать о вкусе устриц с теми, кто их не только не пробовал, но даже не видел.
Хе хе. Посмешил. R6RS это не стандарт, а фигня. А в R5RS только syntax-rules с гигиеной.
А>Ну раз "ничего сложного", думаю pastebin выдержит — давайте-ка реализацию syntax-case на defmacro.
Другие варианты трансформеров там не нужны, и так defmacro есть.
А>Более простая как раз syntax-case (и, что парадоксально, при этом более мощная).
Да нет, не более мощная. Проще чем defmacro нет ничего, он туп до невозможности. syntax-rules же весьма сложен, и, что характерно, абсолютно не нужен. В качестве весёлого упражнения предлагаю попробовать реализовать на syntax-rules инфиксный синтаксис с биндингами и лямбдами, а так же pattern matching и list comprehensions.
А> Она проще и при написании и при понимании уже написанного.
Да ни фига оно не проще. Или ты из тех извращенцев, кто и про темплейты в C++ скажет, что оно "проще"? Тьюринг-полнота языка syntax-rules ещё ничего не значит. Внутри defmacro можно воспользоваться всем, что уже опделелено (включаяя и syntax-rules, между прочим).
А> Выше же приведен пример.
Где?!?
А> Вы конечно можете сказать, что нечитаемость это только плюс
Нечитаемость — это как раз про syntax-rules. Надо постараться очень, чтоб на них написать читаемо, если только не реализуешь очередную примитивную чушь вроде очередного for или там враппера для let и if. А вот с defmacro надо постараться, чтоб написать нечитаемо.
А> (+15 к илитарности, ага), но вряд ли с Вами согласится кто-нибудь кроме таких же коммонлисперов, как Вы.
А кто сказал, что я коммонлиспер? Я очень не люблю CL, меня бесит #' и funcall.
А>Чьорт. Кривая.
Именно так.
А> Нельзя воспользоваться.
Да, совершенно невозможно. Для чего либо серьёзного. Для очередного тупенького синтаксического сахара — запросто, а для компиляции сложного DSL — фигушки.
А> Вы таки открыли мне глаза. То, что делается едва ли не в каждом проекте на схеме "на самом деле" делать нельзя. Понабирают, блин, по объявлениям.
В практически каждом проекте на Схеме метапрограммирование практически не используется.
Здравствуйте, Аноним, Вы писали:
А> Выше же приведен пример.
А, понял, это про тот пример с LINQ... Так и то, и другое решение — нечитаемая каша. Можно было гораздо проще всё сделать.
Re[9]: Scheme to be split into two language
От:
Аноним
Дата:
30.08.09 17:50
Оценка:
Здравствуйте, metaprogrammer, Вы писали:
M> Хе хе. Посмешил. R6RS это не стандарт, а фигня. А в R5RS только syntax-rules с гигиеной.
Ясно, очередной упоротый коммон-лиспер, не читавший Пастернака.
А>>Ну раз "ничего сложного", думаю pastebin выдержит — давайте-ка реализацию syntax-case на defmacro. M> Вот для CL, например, реализация syntax-rules: M>http://www.ccs.neu.edu/home/dorai/mbe/mbe-lsp.html
Так как насчет syntax-case (можешь начать с добавления гигиены в свой MBE)?
M> Другие варианты трансформеров там не нужны, и так defmacro есть.
Конечно "не нужны". Кто ж сомневается. Даже в твоем примере — полторы сотни строк только для разбора темплейта. Примерный размер велосипеда, который нужно добавлять в defmacro КАЖДЫЙ РАЗ в более менее нетривиальном случае (причем в MBE реализованы далеко не все возможности схемовской деструктуризации). И, кстати, изобретение своих терминов (MBE) при наличии устоявшихся говорит о том, что чувак, писавший это понятия не имеет о терминологии (и соответственно о области знаний, в которой она используется).
А>>Более простая как раз syntax-case (и, что парадоксально, при этом более мощная). M> Да нет, не более мощная. Проще чем defmacro нет ничего, он туп до невозможности. syntax-rules же весьма сложен, и, что характерно, абсолютно не
Машина тьюринга (ок, можешь взять чистое лямбда-исчисление) — твой выбор. Зачем тебе лишний сахар? К чему это я? Ах да, "туп до невозможности" не означает "проще ничего нет".
>нужен. В качестве весёлого упражнения предлагаю попробовать реализовать на syntax-rules инфиксный синтаксис с биндингами и лямбдами, а так же pattern matching и list comprehensions.
А почему syntax-rules? На syntax-case оно ТОЧНО не будет сложнее defmacro (в худшем случае больше на тот самый десяток строк, необходимый для реализации defmacro на syntax-case), а скорее всего будет значительно проще (ибо деструктуризация входной формы производится автоматически, да и gensym-ами обмазываться не нужно)
А>> Она проще и при написании и при понимании уже написанного. M> Да ни фига оно не проще. Или ты из тех извращенцев, кто и про темплейты в C++ скажет, что оно "проще"? Тьюринг-полнота языка syntax-rules ещё ничего не значит. Внутри defmacro можно воспользоваться всем, что уже опделелено (включаяя и syntax-rules, между прочим).
Да уж. Когда тебе прямым текстом пишут в коде примеры синтаксиса это, конечно же, очень нечитаемо (паттерн-матчинг не нужен). Все эти car, cadar, caddaar читаются гораздо легче.
А>> Выше же приведен пример. M> Где?!?
Выше
А>> Вы конечно можете сказать, что нечитаемость это только плюс M> Нечитаемость — это как раз про syntax-rules. Надо постараться очень, чтоб на них написать читаемо, если только не реализуешь очередную примитивную чушь вроде очередного for или там враппера для let и if. А вот с defmacro надо постараться, чтоб написать нечитаемо.
А чего стараться-то. С defmacro ВСЕГДА выходит нечитаемая каша. Старайся, не старайся — этого не избежать.
А>> (+15 к илитарности, ага), но вряд ли с Вами согласится кто-нибудь кроме таких же коммонлисперов, как Вы. M> А кто сказал, что я коммонлиспер? Я очень не люблю CL, меня бесит #' и funcall.
Да по степени упорости видно.
А>>Чьорт. Кривая. M> Именно так.
Ога.
А>> Нельзя воспользоваться. M> Да, совершенно невозможно. Для чего либо серьёзного. Для очередного тупенького синтаксического сахара — запросто, а для компиляции сложного DSL — фигушки.
О. Начал вводить граничные условия. Чувствуешь что облажался? Напомнить, чего ты там говорил? Таки давай уже расскажи людям, какие именно макросы нельзя использовать в том же модуле (или TLP), в котором они определены.
А>> Вы таки открыли мне глаза. То, что делается едва ли не в каждом проекте на схеме "на самом деле" делать нельзя. Понабирают, блин, по объявлениям. M> В практически каждом проекте на Схеме метапрограммирование практически не используется.
Идиоты атакуют.
Здравствуйте, Аноним, Вы писали:
M>> Хе хе. Посмешил. R6RS это не стандарт, а фигня. А в R5RS только syntax-rules с гигиеной. А>Ясно, очередной упоротый коммон-лиспер, не читавший Пастернака.
А не пойти ка ли тебе погулять мимо, а? И гулять до тех пор, пока все основные реализации не будут поддерживать R6RS?
И ещё — я не коммонлиспер. Я лет десять на CL не писал. Мой основной инструмент — Схема.
А>Так как насчет syntax-case (можешь начать с добавления гигиены в свой MBE)?
Это тривиальное расширение. Мой вариант показывать не буду — явно не в коня корм.
А>Конечно "не нужны". Кто ж сомневается. Даже в твоем примере — полторы сотни строк только для разбора темплейта.
Ну, это же CL, там всё перанально делается. Важен лишь тот факт, что достаточно сделать это ровно один раз, средствами тупых макр, и больше не париться.
А>Машина тьюринга (ок, можешь взять чистое лямбда-исчисление) — твой выбор. Зачем тебе лишний сахар? К чему это я? Ах да, "туп до невозможности" не означает "проще ничего нет".
Ты чушь несёшь. Феерическую.
А>А почему syntax-rules?
Потому что именно к нему претензии, и вообще к гигиеническим макрам.
А> На syntax-case оно ТОЧНО не будет сложнее defmacro (в худшем случае больше на тот самый десяток строк, необходимый для реализации defmacro на syntax-case),
defmacro на syntax-case — это одна строка, умник ты недоделанный. Если это полноценная реализация syntax-case, а не как обычно.
А> а скорее всего будет значительно проще (ибо деструктуризация входной формы производится автоматически, да и gensym-ами обмазываться не нужно)
Да на хрен не нужна ТАКАЯ деструктуризация. Ты реши, реши мои задачки. Я поржу.
А>Да уж. Когда тебе прямым текстом пишут в коде примеры синтаксиса это, конечно же, очень нечитаемо (паттерн-матчинг не нужен). Все эти car, cadar, caddaar читаются гораздо легче.
Криволапость отдельных лиспокодеров никакого отношения к фундаментальности defmacro не имеет.
M>> Нечитаемость — это как раз про syntax-rules. Надо постараться очень, чтоб на них написать читаемо, если только не реализуешь очередную примитивную чушь вроде очередного for или там враппера для let и if. А вот с defmacro надо постараться, чтоб написать нечитаемо. А>А чего стараться-то. С defmacro ВСЕГДА выходит нечитаемая каша. Старайся, не старайся — этого не избежать.
Как смешно бредит. Даже я так не умею. Тебе уже показали, что этот тупой и убогий вариант pattern matching, который есть в syntax-rules, реализуется тривиально. Так же тривиально реализуются и другие — в том числе и, например, PEG, или любой другой способ описания синтаксиса. Посмеши публику, сделай это на syntax-rules и прочих чисто схемских фичах.
M>> Да, совершенно невозможно. Для чего либо серьёзного. Для очередного тупенького синтаксического сахара — запросто, а для компиляции сложного DSL — фигушки. А>О. Начал вводить граничные условия. Чувствуешь что облажался?
Облажался ты и только ты.
А> Напомнить, чего ты там говорил? Таки давай уже расскажи людям, какие именно макросы нельзя использовать в том же модуле (или TLP), в котором они определены.
Берём, например, свежий SISC или ещё какую практически применимую Схему. Определяем в модуле функцию f, и (define-macro mf (x) (f x)). В том же модуле пытаемся использовать (mf ...). Обламываемся и горько плачем.
А>>> Вы таки открыли мне глаза. То, что делается едва ли не в каждом проекте на схеме "на самом деле" делать нельзя. Понабирают, блин, по объявлениям. M>> В практически каждом проекте на Схеме метапрограммирование практически не используется. А>Идиоты атакуют.
Я вижу, ты самокритичен. Это хорошо. А что такое метапрограммирование ты не знаешь. Попробуй, если не согласен с моим вердиктом и не считаешь себя шибко неумным, реши мои задачки. Инфиксный синтаксис, pattern matching (с ellipsis, конечно же, и с banana brackets в стиле F#). Да ещё обязательно с гигиеной, ведь без гигиены — это же defmacro получится. А, да, чуть не забыл — ещё и list comprehensions сделай. Порадуй почтенную публику.
Здравствуйте, metaprogrammer, Вы писали: M> Хе хе. Посмешил. R6RS это не стандарт, а фигня.
Что не нравится в r6rs?
M> Вот для CL, например, реализация syntax-rules: M>http://www.ccs.neu.edu/home/dorai/mbe/mbe-lsp.html
The Scheme report requires that the macro definers be hygienic, i.e., that they automatically avoid these lexical captures. This Common Lisp implementation does not provide hygiene.
Вроде это-таки никакие не syntax-rules, а просто ими прикидываются? Я что-то не то смотрю?
M>инфиксный синтаксис
Можно пример реализации?
M>pattern matching
match.scm M>list comprehensions.
srfi-42
Здравствуйте, metaprogrammer, Вы писали: M> Благо, во всех нормальных Схемах define-macro имеется. Плохо то, что у него кривая семантика в связке с модулями — как правило нельзя воспользоваться макрой, определённой внутри модуля, в этом самом модуле.
Ну это проблемы этого самого define-macro.
С syntax-rules/case это не всегда так. Chicken-у как правило по барабану. В plt и в r6rs действуют определенные ограничения, связанные с разделением на стадии выполнения, но это не мешает юзать простые макросы:
[cat@cat-arch tmp]$ cat macro.ss
(import (rnrs))
(define f +)
(define-syntax g
(syntax-rules ()
((g stuff ...)
(f stuff ...))))
Здравствуйте, Mr.Cat, Вы писали:
M>> Хе хе. Посмешил. R6RS это не стандарт, а фигня. MC>Что не нравится в r6rs?
То, что работать сейчас надо, а поддерживать его ещё незнамо когда будут.
MC>Вроде это-таки никакие не syntax-rules, а просто ими прикидываются? Я что-то не то смотрю?
Базар не за гигиену был, а за destructuring. Гигиена тоже реализуется, легко.
M>>инфиксный синтаксис MC>Можно пример реализации?
Уже приводил в соседней ветке.
M>>pattern matching MC>match.scm
Без бананов и ..., фигня. И криво сделано.
M>>list comprehensions. MC>srfi-42
Здравствуйте, metaprogrammer, Вы писали: M>Гигиена тоже реализуется, легко.
Ну раз не реализована — видимо, не так легко. Для гигиены нужен, например, полный список биндингов в месте объявления макры. В CL его можно получить?
MC>>Можно пример реализации? M> Уже приводил в соседней ветке.
Напомни плз. ссылку, там вы с thesz так нафлудили, что нифига не найдешь.
M>>>pattern matching MC>>match.scm M> Без бананов
Это кто такие?
M>криво
В чем кривизна (и match, и ec)? Юзал — доволен.
Здравствуйте, metaprogrammer, Вы писали: MC>>Что не нравится в r6rs? M> То, что работать сейчас надо, а поддерживать его ещё незнамо когда будут.
Plt, ikarus, ypsilon, iron, mosh. Особенно первые три.
Здравствуйте, Mr.Cat, Вы писали:
M>>Гигиена тоже реализуется, легко. MC>Ну раз не реализована — видимо, не так легко. Для гигиены нужен, например, полный список биндингов в месте объявления макры. В CL его можно получить?
Достаточно списка биндингов в самой макре.
MC>>>Можно пример реализации? M>> Уже приводил в соседней ветке. MC>Напомни плз. ссылку, там вы с thesz так нафлудили, что нифига не найдешь.
А мне, думаешь, легко искать? Придётся заново копипастить...
Здравствуйте, Mr.Cat, Вы писали:
M>> Это раскроется в (f 1 2 3), f в рантайме только вызывается. MC>Ессно, а как тебе надо?
А мне надо из трансформера вызвать функцию, которая тут же была определена. Более того, которая была порождена при раскрытии другой макры, вместе с определением самого этого трансформера.
Здравствуйте, Mr.Cat, Вы писали:
M>> То, что работать сейчас надо, а поддерживать его ещё незнамо когда будут. MC>Plt, ikarus, ypsilon, iron, mosh. Особенно первые три.
Здравствуйте, metaprogrammer, Вы писали: MC>>Ну раз не реализована — видимо, не так легко. Для гигиены нужен, например, полный список биндингов в месте объявления макры. В CL его можно получить? M> Достаточно списка биндингов в самой макре.
Ты имеешь в виду биндингов, вводимых самой макрой? Нет, не достаточно. Один из аспектов гигиены — существующие в месте объявления макры биндинги, если они используются в макре, не должны перекрываться одноименными биндингами, существующими в месте использования макры.
M>http://pastebin.org/13419
Благодарю.
M> Это banana brackets в F#.
Это они: http://en.wikibooks.org/wiki/F_Sharp_Programming/Active_Patterns ?
Непонятно, зачем они нужны в scheme, это ведь свсего лишь "анонимные типы" — чтобы не объявлять вручную лишних типов в статически типизированном языке. Не?
M>>>криво MC>>В чем кривизна (и match, и ec)? Юзал — доволен. M> В реализации. Сложно.
Не буду спорить: арбуз и свиной хрящик.
Здравствуйте, metaprogrammer, Вы писали: M>http://pastebin.org/13419
А чем, если не секрет, там мешает гигиена?
И да, что за либа используется для определения парсера?
Здравствуйте, metaprogrammer, Вы писали: M> А мне надо из трансформера вызвать функцию, которая тут же была определена. Более того, которая была порождена при раскрытии другой макры, вместе с определением самого этого трансформера.
Это вроде можно в chicken — попробуй. В plt и r6rs с этим сложнее, да.
Здравствуйте, metaprogrammer, Вы писали: MC>>Plt, ikarus, ypsilon, iron, mosh. Особенно первые три. M> Ни одна из них не подходит, по разным причинам.
То есть дело не в r6rs, а в тебе.
Тьфу ты, ошибся. Это-то можно реализовать и без списка внешних биндингов.
А вот как повторить сочетание гигиены и модулей? Например, в r6rs макрос может ссылаться на определенные в модуле неэкспортируемые идентификаторы: