Re[8]: Scheme to be split into two language
От: metaprogrammer  
Дата: 30.08.09 06:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Таки defmacro реализуется в десяток строк на syntax-case.

M>> Которого нет в стандарте.
А>Забавно беседовать о вкусе устриц с теми, кто их не только не пробовал, но даже не видел.

Хе хе. Посмешил. R6RS это не стандарт, а фигня. А в R5RS только syntax-rules с гигиеной.

А>Ну раз "ничего сложного", думаю pastebin выдержит — давайте-ка реализацию syntax-case на defmacro.


Вот для CL, например, реализация syntax-rules:

http://www.ccs.neu.edu/home/dorai/mbe/mbe-lsp.html

Другие варианты трансформеров там не нужны, и так 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 — фигушки.

А> Вы таки открыли мне глаза. То, что делается едва ли не в каждом проекте на схеме "на самом деле" делать нельзя. Понабирают, блин, по объявлениям.


В практически каждом проекте на Схеме метапрограммирование практически не используется.
Re[8]: Scheme to be split into two language
От: metaprogrammer  
Дата: 30.08.09 06:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Выше же приведен пример.


А, понял, это про тот пример с 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> В практически каждом проекте на Схеме метапрограммирование практически не используется.
Идиоты атакуют.
Re[10]: Scheme to be split into two language
От: metaprogrammer  
Дата: 30.08.09 18:07
Оценка:
Здравствуйте, Аноним, Вы писали:

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 сделай. Порадуй почтенную публику.
Re[9]: Scheme to be split into two language
От: Mr.Cat  
Дата: 30.08.09 18:33
Оценка:
Здравствуйте, 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
Re[7]: Scheme to be split into two language
От: Mr.Cat  
Дата: 30.08.09 18:37
Оценка:
Здравствуйте, 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 ...))))

(display (g 1 2 3))(newline)
[cat@cat-arch tmp]$ plt-r6rs macro.ss
6
Re[10]: Scheme to be split into two language
От: metaprogrammer  
Дата: 30.08.09 18:37
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

M>> Хе хе. Посмешил. R6RS это не стандарт, а фигня.

MC>Что не нравится в r6rs?

То, что работать сейчас надо, а поддерживать его ещё незнамо когда будут.

MC>Вроде это-таки никакие не syntax-rules, а просто ими прикидываются? Я что-то не то смотрю?


Базар не за гигиену был, а за destructuring. Гигиена тоже реализуется, легко.

M>>инфиксный синтаксис

MC>Можно пример реализации?

Уже приводил в соседней ветке.

M>>pattern matching

MC>match.scm

Без бананов и ..., фигня. И криво сделано.

M>>list comprehensions.

MC>srfi-42

Тоже — криво сделано. Очень криво.
Re[11]: Scheme to be split into two language
От: Mr.Cat  
Дата: 30.08.09 18:43
Оценка:
Здравствуйте, metaprogrammer, Вы писали:
M>Гигиена тоже реализуется, легко.
Ну раз не реализована — видимо, не так легко. Для гигиены нужен, например, полный список биндингов в месте объявления макры. В CL его можно получить?

MC>>Можно пример реализации?

M> Уже приводил в соседней ветке.
Напомни плз. ссылку, там вы с thesz так нафлудили, что нифига не найдешь.

M>>>pattern matching

MC>>match.scm
M> Без бананов
Это кто такие?

M>криво

В чем кривизна (и match, и ec)? Юзал — доволен.
Re[8]: Scheme to be split into two language
От: metaprogrammer  
Дата: 30.08.09 18:44
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>(define f +)

MC>(define-syntax g
MC> (syntax-rules ()
MC> ((g stuff ...)
MC> (f stuff ...))))

Внимательнее, внимательнее. Нелья же так!

MC>(display (g 1 2 3))(newline)


Это раскроется в (f 1 2 3), f в рантайме только вызывается.
Re[11]: Scheme to be split into two language
От: Mr.Cat  
Дата: 30.08.09 18:46
Оценка:
Здравствуйте, metaprogrammer, Вы писали:
MC>>Что не нравится в r6rs?
M> То, что работать сейчас надо, а поддерживать его ещё незнамо когда будут.
Plt, ikarus, ypsilon, iron, mosh. Особенно первые три.
Re[9]: Scheme to be split into two language
От: Mr.Cat  
Дата: 30.08.09 18:46
Оценка:
Здравствуйте, metaprogrammer, Вы писали:
M> Это раскроется в (f 1 2 3), f в рантайме только вызывается.
Ессно, а как тебе надо?
Re[12]: Scheme to be split into two language
От: metaprogrammer  
Дата: 30.08.09 18:49
Оценка: 5 (1)
Здравствуйте, Mr.Cat, Вы писали:

M>>Гигиена тоже реализуется, легко.

MC>Ну раз не реализована — видимо, не так легко. Для гигиены нужен, например, полный список биндингов в месте объявления макры. В CL его можно получить?

Достаточно списка биндингов в самой макре.

MC>>>Можно пример реализации?

M>> Уже приводил в соседней ветке.
MC>Напомни плз. ссылку, там вы с thesz так нафлудили, что нифига не найдешь.

А мне, думаешь, легко искать? Придётся заново копипастить...

http://pastebin.org/13419

M>> Без бананов

MC>Это кто такие?

Это banana brackets в F#.

M>>криво

MC>В чем кривизна (и match, и ec)? Юзал — доволен.

В реализации. Сложно.
Re[10]: Scheme to be split into two language
От: metaprogrammer  
Дата: 30.08.09 18:52
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

M>> Это раскроется в (f 1 2 3), f в рантайме только вызывается.

MC>Ессно, а как тебе надо?

А мне надо из трансформера вызвать функцию, которая тут же была определена. Более того, которая была порождена при раскрытии другой макры, вместе с определением самого этого трансформера.
Re[12]: Scheme to be split into two language
От: metaprogrammer  
Дата: 30.08.09 18:53
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

M>> То, что работать сейчас надо, а поддерживать его ещё незнамо когда будут.

MC>Plt, ikarus, ypsilon, iron, mosh. Особенно первые три.

Ни одна из них не подходит, по разным причинам.
Re[13]: Scheme to be split into two language
От: Mr.Cat  
Дата: 30.08.09 19:13
Оценка:
Здравствуйте, metaprogrammer, Вы писали:
MC>>Ну раз не реализована — видимо, не так легко. Для гигиены нужен, например, полный список биндингов в месте объявления макры. В CL его можно получить?
M> Достаточно списка биндингов в самой макре.
Ты имеешь в виду биндингов, вводимых самой макрой? Нет, не достаточно. Один из аспектов гигиены — существующие в месте объявления макры биндинги, если они используются в макре, не должны перекрываться одноименными биндингами, существующими в месте использования макры.
[cat@cat-arch tmp]$ cat macro.ss 
(define f +)
(define-syntax g
  (syntax-rules ()
                ((g stuff ...)
                 (f stuff ...))))

(let ((f -))
  (display (f 1 2 3))
  (newline)
  (display (g 1 2 3)))
  (newline)
[cat@cat-arch tmp]$ csi -s macro.ss 
-4
6


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> В реализации. Сложно.
Не буду спорить: арбуз и свиной хрящик.
Re[13]: Scheme to be split into two language
От: Mr.Cat  
Дата: 30.08.09 19:17
Оценка:
Здравствуйте, metaprogrammer, Вы писали:
M>http://pastebin.org/13419
А чем, если не секрет, там мешает гигиена?
И да, что за либа используется для определения парсера?
Re[11]: Scheme to be split into two language
От: Mr.Cat  
Дата: 30.08.09 19:20
Оценка:
Здравствуйте, metaprogrammer, Вы писали:
M> А мне надо из трансформера вызвать функцию, которая тут же была определена. Более того, которая была порождена при раскрытии другой макры, вместе с определением самого этого трансформера.
Это вроде можно в chicken — попробуй. В plt и r6rs с этим сложнее, да.
Re[13]: Scheme to be split into two language
От: Mr.Cat  
Дата: 30.08.09 19:21
Оценка:
Здравствуйте, metaprogrammer, Вы писали:
MC>>Plt, ikarus, ypsilon, iron, mosh. Особенно первые три.
M> Ни одна из них не подходит, по разным причинам.
То есть дело не в r6rs, а в тебе.
Re[14]: Scheme to be split into two language
От: Mr.Cat  
Дата: 30.08.09 21:26
Оценка:
Здравствуйте, Mr.Cat, Вы писали:
MC>
MC>[cat@cat-arch tmp]$ cat macro.ss 
MC>(define f +)
MC>(define-syntax g
MC>  (syntax-rules ()
MC>                ((g stuff ...)
MC>                 (f stuff ...))))

MC>(let ((f -))
MC>  (display (f 1 2 3))
MC>  (newline)
MC>  (display (g 1 2 3)))
MC>  (newline)
MC>[cat@cat-arch tmp]$ csi -s macro.ss 
MC>-4
MC>6
MC>


Тьфу ты, ошибся. Это-то можно реализовать и без списка внешних биндингов.
А вот как повторить сочетание гигиены и модулей? Например, в r6rs макрос может ссылаться на определенные в модуле неэкспортируемые идентификаторы:
[cat@cat-arch tmp]$ cat macro.ss
(library (macro)
  (export g)
  (import (rnrs))

(define f +)
(define-syntax g
  (syntax-rules ()
                ((g stuff ...)
                 (f stuff ...)))))
[cat@cat-arch tmp]$ cat program.ss
(import (rnrs) (for (macro) expand))
(display (g 1 2 3))(newline)
[cat@cat-arch tmp]$ ypsilon --sitelib=. program.ss
6
Re[14]: Scheme to be split into two language
От: metaprogrammer  
Дата: 30.08.09 21:39
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

M>> Ни одна из них не подходит, по разным причинам.

MC>То есть дело не в r6rs, а в тебе.

Естественно. Какой же ещё придурок мог понаписать привязанного к bigloo кода.

С другой стороны, мне то syntax-case особо не нужен, в bigloo есть define-macro. Но в R6RS много других полезных плюшек.

А вообще — поглядываю на Iron Scheme, может и пригодится.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.