?

Log in

No account? Create an account

Метапрограммирование в Агде и немного философии - Excelsior

Aug. 27th, 2013

09:49 am - Метапрограммирование в Агде и немного философии

Previous Entry Share Next Entry

Comments:

From:Valentin Budaev
Date:August 27th, 2013 11:34 pm (UTC)
(Link)
Конечно же в TH все в порядке - делать макросистему со статическими гарантиями корректности и без гигиены было бы, как минимум, странно :) Речь шла о формальном определении гигиены. На интуитивном уровне всем понятно, что это за зверь, и реализации гигиены - есть, но вот нормального формально строгого определения - нет. Я выше кинул ссылку на статью по этой теме как раз.

ЗЫ: посмотрел обход гигиены в TH на 19 странице слайдов - это, конечно, тихий ужас. Взять и переложить ответственность на пользователя макроса - архигениальное решение.

Edited at 2013-08-27 11:44 pm (UTC)
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:August 28th, 2013 05:59 am (UTC)
(Link)
Вы имеете ввиду $(dyn "it") на страничке, на которой справа-снизу написано 26?
(Reply) (Parent) (Thread)
From:Valentin Budaev
Date:August 28th, 2013 11:17 am (UTC)
(Link)
Ага, его.

Ну TH вообще в целом как макросистема на мой взгляд предельно неудобен.
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:August 29th, 2013 05:48 am (UTC)
(Link)
А чем $(dyn "it") отличается от (syntax-local-introduce #'it)?
(Reply) (Parent) (Thread)
From:Valentin Budaev
Date:August 29th, 2013 09:49 am (UTC)
(Link)
Тем, что $(dyn "it") надо писать при вызове каждый раз пользователю, а (syntax-local-introduce #'it) пишет один раз макрописатель.
(Reply) (Parent) (Thread)
[User Picture]
From:voidex
Date:November 20th, 2013 08:38 am (UTC)
(Link)
Однако когда я вижу
[| putStrLn (show it) |]

мне не очень понятно, что это за it такой
В этом смысле
[| putStrLn (show $(dyn "it")) |]

читается проще
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:August 29th, 2013 05:48 am (UTC)
(Link)
Какие бы вы выделили основные недостатки макросистемы TH?
(Reply) (Parent) (Thread)
From:Valentin Budaev
Date:August 29th, 2013 09:12 am (UTC)
(Link)
1. Это даже не про саму макросистему - отсутствие хорошего, качественного АПИ. Пусть даже система не слишком выразительна - но написание макросов очень узкая задача (разбор и генерация АСТ), а раз задача очень узкая - для нее можно написать удобный, специализированный апи/дсл/етц. (все эти pattern language и т.п.) Да, он не будет универсален - но покроет большую часть юзкейсов и кардинально повысит юзабельность. Те 10%, что он не покроет, я уж буду писать руками, не проблема, но не заставляйте меня самому крутить педали в оставшихся 90%.

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

3. Отсутствие локальных макросов, macrogenerated макросов - многие "патерны" использования макросов на них основаны.

4. Отсутствие гомоиконности в конструкциях языка - когда синтаксис конструкций спроектирован сразу так, что его _удобно_ разбирать и генерить - это большой плюс. Но чтобы исключить этот недостаток, необходимо быть лиспом :)

*хороший АПИ из первого пункта может свести к минимуму подобного рода недостаток

5. Вызов макросов (и вот эти $(dyn "it")) туда же. Макрос пишется, чтобы пользователю было _удобно_. Если вы для использования макросов (и даже банального вызова) заставляете писать кучу лишних закорючек - это никак не способствует удобству. Пусть писать макросы даже будет немного сложнее - но для пользователя должно быть все предельно легко, прозрачно и с минимальными затратами. Никаких лишних телодвижений.

6. Отсутствие всяких фич, специально сделанных для макросов - типа тех же syntax parameters, renamers, возможности ассоциирования с символами произвольной статической информации и ее использования

7. Отсутствие поддержки со стороны рантайма - syntax objects, фазы, модульная система. По-хорошему рантайм должен учитывать наличие макросов, в хаскеле макросы - сбоку припека для рантайма.

Edited at 2013-08-29 09:15 am (UTC)
(Reply) (Parent) (Thread)