?

Log in

No account? Create an account

Новый релиз macro paradise: теперь есть макро аннотации и можно использовать с 2.10 - Excelsior

Aug. 7th, 2013

08:00 am - Новый релиз macro paradise: теперь есть макро аннотации и можно использовать с 2.10

Previous Entry Share Next Entry

Всем привет! Сегодня хочу рассказать о том, что на днях выпустил новую версию macro paradise: http://scalamacros.org/news/2013/08/05/macro-paradise-2.0.0-snapshot.html. По ссылке есть детали, а здесь я просто вкратце остановлюсь на главных моментах:

1) Теперь paradise это плагин к компилятору Скалы, поддерживающий квазицитаты и макро аннотации для серии 2.10.x. Народ из Spire уже подтянулся использовать его для переписывания существующих макросов на квазицитаты. Остальной народ ждет ближайших выходных :)

2) Как обычно, в плане того, что касается макросов, можно рассчитывать на мою личную поддержку. После публикации Скалы 2.11 будет выпущен плагин для 2.11 и возможности из парадайза, которые не войдут в Скалу 2.11 (например, макро аннотации, если мы не успеем реализовать соответствующий Scala improvement process до заморозки кода), я буду поддерживать в 2.11.

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

4) Продолжая традицию макросов приносить в мир добро, макро аннотации позволяют значительно упростить внутренние детали реализации компилятора и дать пользователям возможности для конфигурации стандартных возможностей языка. Похоже на то, что удастся объединить разрозненные куски кода, отвечающие на синтетические мемберы (кейс классы, геттеры/сеттеры для валов, и так далее) в единый механизм. Например, удалось практически полностью реализовать @kase классы на макросах. Будущие выпуски парадайза позволят полностью покрыть спецификацию, даже в самых ее крайних случаях.

Tags: ,

Comments:

From:zhengxi
Date:August 7th, 2013 06:07 am (UTC)
(Link)
супер, буду тоже ждать ближайших выходных :)

вопрос - какие фичи могут быть выкинуты или сильно измениться?
чтобы потом не было сюрпризом.
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:August 7th, 2013 06:22 am (UTC)
(Link)
Квазицитаты уже в 2.11.0-M4, так что навряд ли их кто-то выкинет, а, соответственно, и я их трогать не буду. Макро аннотации это первая серьезная реализация, поэтому она может поменяться (но не думаю, что кардинально) в процессе обтачивания функциональности для написания предложения по добавлению их в язык. Также я планирую добавить http://docs.scala-lang.org/overviews/macros/implicits.html#fundep_materialization.

Вообще, я стараюсь не ломать безвозвратно уже существующие решения. Как, например, получилось с тайп макросами, которые в последний момент не приняли в язык. Пришлось потратить время для того, чтобы найти замену для подавляющего большинства сценариев их использования - имплисит макросы для программирования на уровне типов + макро аннотации для генерации публичного кода. Теперь мы видим имплисит макросы уже в 2.10.2, а аннотации в новом релизе парадайза.

Edited at 2013-08-07 06:23 am (UTC)
(Reply) (Parent) (Thread)
[User Picture]
From:anton_y_k
Date:August 7th, 2013 02:18 pm (UTC)
(Link)
Главное, чтобы какие-то более-менее высокоуровневые методы сделали, а то писать AST-шки чуть ли не вручную очень напрягает, аналогично с обходом тагов класса (впрочем это уже больше обычного рефлекшина касается), где надо писать кучу циклов с патернматчингом для того, чтобы достучаться до какого-то метода или проперти.
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:August 7th, 2013 02:20 pm (UTC)
(Link)
В новом парадайзе для этого есть квазицитаты. А про reflection API, да, есть такое, есть и планы пофиксить.
(Reply) (Parent) (Thread)
[User Picture]
From:anton_y_k
Date:August 7th, 2013 02:53 pm (UTC)
(Link)
Отлично! А то, честно говоря, из-за чрезмерной низкоуровневости предыдущего API (и соответственно сложностью написания и отладки) мой опыт с макросами ограничился несколькими учебными приложениями.
(Reply) (Parent) (Thread)
From:zhengxi
Date:August 11th, 2013 04:15 am (UTC)
(Link)
Глупый вопрос - а где вот этот macro-paradise_2.10.2-2.0.0-SNAPSHOT.jar скачать?
Или хотя бы из какого репозитория скомпилять?
(Reply) (Thread)
From:zhengxi
Date:August 11th, 2013 04:52 am (UTC)
(Link)
https://oss.sonatype.org/content/repositories/snapshots/org/scala-lang/plugins/macro-paradise_2.10.2/2.0.0-SNAPSHOT/

полчаса искал, блин
этот сайт еще и закрыт от индексирования поисковиками.
(Reply) (Parent) (Thread)
From:zhengxi
Date:August 11th, 2013 07:57 pm (UTC)
(Link)
Хорощо работает.

Две недоработки только:

1. для конструкции ..${} часто бывает нужно явно указать тип выражения внутри скобок (List[Tree]), пример

2. не получается через квазицитату создать CaseDef, вроде q"case 1 => 2"

Edited at 2013-08-11 07:58 pm (UTC)
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:August 11th, 2013 09:40 pm (UTC)
(Link)
1) Есть для такого баг, да: https://issues.scala-lang.org/browse/SI-6840.
2) Попробуй cq"1 => 2".
(Reply) (Parent) (Thread)
From:zhengxi
Date:August 11th, 2013 10:56 pm (UTC)
(Link)
у обычного, не списочного ${} этот баг тоже проявляется.

если там что-то вроде ${ if (cond) q"tree1" else q"tree2" }, то приходится писать ${ (if (cond) q"tree1" else q"tree2") : Tree }
(Reply) (Parent) (Thread)