August 7th, 2013

glider

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

Всем привет! Сегодня хочу рассказать о том, что на днях выпустил новую версию 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 классы на макросах. Будущие выпуски парадайза позволят полностью покрыть спецификацию, даже в самых ее крайних случаях.
glider

Зачем компилятор должен поддерживать гигиену?

Затем, чтобы синтаксический сахар в вот таких ситуациях
case class C(x: D)

↓

object C {
  def apply(x: D) = new C(x)
}
Не приводил к казусам вроде:
case class C(x: D)
object C { type D = Double }

↓

object C {
  type D = Double
  def apply(x: D) = new C(x)
}
Как говорится, science. It works. Низкотехнологичные решения в таких ситуациях вынуждены прибегать к очень некрасивым хакам для реализации того, что в гигиеничных системах достигается забесплатно.