35
Проект “Кеплер”: макросы для Скалы Евгений Бурмако EPFL, LAMP 29 октября 2011

Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Проект “Кеплер”: макросы для Скалы

Евгений Бурмако

EPFL, LAMP

29 октября 2011

Page 2: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

План

Проект “Кеплер”

Макросы за 15 минут

Сценарии использования

Легковесные макросы для Скалы

Заключение

Page 3: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Проект “Кеплер”Цель: Реализовать макросы, типобезопасный механизмметапрограммирования времени компиляции для Скалы.

Идеи: В основном из Немерле, хотя будет интереснопоэкспериментировать с некоторыми замечательнымимоментами из Scheme, MetaML и Template Haskell.

Участники: Евгений Бурмако (ваш покорный слуга),Кристофер Фогт (автор Scala Integrated Query),Штефан Цайгер (автор ScalaQuery).

Статус: В процессе написания спецификации ScalaImprovement Proposal, некоторые аспекты уже обсуждаются врамках SIP “String interpolation and formatting”.

Page 4: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

В двух словахУже очень долгое время макросы в популярных языкахпрограммирования ассоциируются с макросами С/С++.Неудивительно, что многие автоматически воспринимаютслово “макрос” в штыки.

В отличие от макросов препроцессора, наши макросы:

I Представляют собой код на полноценной Скале

I Работают с высокоуровневыми и типизированнымидеревьями выражений

I Выполняются в контексте компилятора, поэтому имеютдоступ ко всей семантической информации, доступнойкомпилятору

I Не изменяют синтаксис Скалы

Наши макросы напоминают макросы Лиспа, доработанные дляподдержки богатого синтаксиса и статической типизации.

Page 5: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Прежде, чем мы начнемМне крайне интересно услышать ваши комментарии,предложения и критику. Дизайн макросов только-только началобретать твердые очертания, поэтому его можно подточить дляподдержки ваших проектов и сценариев использования.

За всего лишь месяц жизни проекта уже было пару случаев,когда я вносил в черновик спецификации значительныеизменения для поддержки тех или иных сценариев, о которых яузнавал в процессе дискуссий. Пожалуйста, не стесняйтесь ипишите мне на [email protected].

Кроме того, все нижеописанное является крайнеэкспериментальным и может быть в любой момент измененона 180◦. На текущий момент проект “Кеплер” просто являетсямоей будущей диссертацией, поэтому ни Scala Solutions, ниTypeSafe никак с ним не связаны.

Page 6: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

План

Проект “Кеплер”

Макросы за 15 минут

Сценарии использования

Легковесные макросы для Скалы

Заключение

Page 7: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Макросы на микро-уровне

macro printf(format : string, params parms : array[expr]){def (evals, refs) = make_exprs(parse(format), parms);def seq = evals + refs.Map(x => <[ Write($x) ]>);<[ { ..$seq } ]>

}

printf("Value = %d", 123 + 877)

{def _N_1812 = (123 + 877 : int);Console.Write("Value = ");Console.Write(_N_1812)

}

Page 8: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

МакросыЭто был довольно сложный фрагмент кода (кстати, код этотнаписан на Немерле). Давайте подробно рассмотримконцепции, относящиеся к макросам:

I Printf - макрос. Его тело представляет собой метакод,т.е. код, который исполняется во время компиляции.

I В качестве аргументов printf принимает наборвыражений времени компиляции, т.е. узлов AST.Возвращаемое значение тоже является AST.

I Когда компилятор встречает вызов макроса, он исполняетметакод (т.е. тело макроса) и вставляет [splice] егорезультат (т.е. сгенерированный код) в место вызова.

I Несмотря на то, что макросы исполняются на этапекомпиляции и не имеют доступа к значениям временивыполнения, они могут вызывать произвольные функции иметоды, в том числе и стандартную библиотеку.

Page 9: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

КвазицитатыГенерация кода обычно весьма нудное занятие, но врассматриваемом примере нам удалось воспользоваться весьмаэлегантной техникой:

I Прикольные скобки <[ ... ]> задают квазицитаты[quasiquotations], фрагменты кода, которые можно удобнокомпозировать и декомпозировать.

I Большие фрагменты кода можно собирать из маленькихпри помощи так называемого сплайсинга [splicing].Выражения $x и ..$seq являются сплайсами.

I Квазицитаты возвращают значения времени компиляции.Отметим важный факт, который резюмирует все, что мына текущий момент знаем про макросы: возвращаемоезначение макроса из примера (последняя строчка в телемакроса) - квазицитата, т.е. AST. Все сходится!

Page 10: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Сопоставление с образцомКвазицитаты также находят применение в сопоставлении собразцом для удобной декомпозиции абстрактныхсинтаксических деревьев. Например, некий гипотетическийоптимизатор может выглядеть следующим образом:

match (e) {...| <[ $x * 1 ]> => <[ $x ]>

}

Будучи использованными с левой стороны сопоставления собразцом, сплайсы задают именованные “отверстия” вквазицитатах.

Очень красивый трюк, правда? Но он не исчерпывает феериюсинтаксических чудес на сегодня. О еще более захватывающихвещах можно почитать в моем блоге.

Page 11: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

ГигиенаЗа кадром остались детали разбора строки формата и сборкикусочков выходной строки. Во всех подробностях реализациюможно посмотреть в статье Влада Чистякова, но пока что мыостановимся на одном интересном фрагменте.

Для того, чтобы в сгенерированном коде сослаться напеременные, доступные в месте вызова, в метакоде написано<[ $(expr : usesite) ]>. Зачем все так усложнять?

Все это нужно потому, что макросы Немерле являютсягигиеничными, т.е. они переименовывают генерируемыепеременные и ссылки на переменные для того, чтобыпредотвратить случайные пересечения имен.

Чаще всего это как раз то, что нужно, поэтому гигиенавключена по умолчанию, но иногда (например, для реализациистроковой интерполяции) это мешает, поэтому при желаниигигиену можно обойти.

Page 12: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Макросы на макро-уровне

[Usage(Phase.BeforeInheritance, Targets.Class)]macro Serializable (t : TypeBuilder){t.AddImplementedInterface (<[ ISerializable ]>)

}

[Serializable]class S {public this (v : int, m : S) { a = v; my = m; }my : S;a : int;

}

Page 13: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

КодогенерацияМакросы верхнего уровня, которые применяются путеманнотирования сущностей программы, являются ответомНемерле на проблему дублирования кода.

Такие макро-аннотации крайне полезны для устранениякопипасты, против которой бессильны ООП и ФП. Особенноприятно использовать подобные макросы тем, кто уже имеетопыт работы с текстовыми генераторами вроде T4 - ведь вданном случае все делается через квазицитаты, которыеявляются высокоуровневыми, типобезопасными икомпозируемыми.

При соответствующей поддержке со стороны языка вквазицитатах можно задавать произвольные целевые языки(например, HTML), что делает макросы еще болеесоблазнительными.

Page 14: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Средства разработкиМакросы содержат в себе немало магии, поэтому для работы сними требуется надежная поддержка средств разработки:

I В силу того, что макросы изменяют порядок сборки (передкомпиляцией основной программы, очевидно, необходимоскомпилировать используемые в программе макросы),средства сборки должны быть в курсе макросов.

I Генерируемый код может понадобиться оттрассировать вотладчике. Отсутствие исходников не являетсясущественной проблемой, ибо мы можем сгенерировать ихиз AST, но этот вопрос все равно надо обдумать.

I Для того, чтобы обеспечивать правильную подсветку ианализ кода, IDE должны знать о макросах, причеммакросы также должны знать об IDE и вести честную игру- быть реентерабельными, быть аккуратными сразделяемым состоянием.

Page 15: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

РезюмеI В отличие от печально известных макросов препроцессора

C/C++, современные макросы работают с AST и тесноинтегрированы в язык и компилятор, что делает ихбезопасными, выразительными и композируемыми.

I Макросы исполняются на этапе компиляции, но при этомимеют доступ к рантайму и библиотекам языка. Такимобразом, например, во время компиляции макрос можетобратиться к базе данных.

I Микро-уровень макросов предоставляет средства длявиртуализации языка программирования и созданиядоменно-специфических языков. Макро-уровень позволяетавтоматически сгенерировать части программы.

I (Фанатам ASM и Reflection.Emit посвящается)Квазицитаты делают анализ и генерацию кода приятным ипродуктивным занятием.

Page 16: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

План

Проект “Кеплер”

Макросы за 15 минут

Сценарии использования

Легковесные макросы для Скалы

Заключение

Page 17: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

На микро-уровнеI Разработка встроенных доменно-специфических языков.

Одним из паттернов eDSL является перегрузка операцийязыка и протаскивание действий пользователя через весьDSL. Макросы позволяют избежать этой весьма хрупкойпроцедуры, так как они могут получить информацию озамысле пользователя непосредственно из AST.

I Синтаксический сахар для монад. Важным частнымслучаем языковой виртуализации является do-нотация длямонад. С помощью макросов ее можно реализовать безподдержки со стороны компилятора.

I Встраивание внешних доменно-специфических языков.При помощи квазицитат в программу можно встраиватьфрагменты кода на произвольных языках. Макросы-обработчики квазицитат могут обеспечить интеграциюэтих языков с главным языком программирования (общийлексический контекст, услуги типизации и т.п.).

Page 18: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

На макро-уровнеI Генерация кода любых разновидностей. С точки зрения

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

I Аспектно-ориентированное программирование.Традиционные парадигмы не способны справиться снекоторыми задачами декомпозиции и дедубликации кода.В результате возникли частные подходы к решению такихзадач. Макросы предоставляют средства для склеиванияаспектов приложения в общем случае.

I Типы данных “a la carte”. Часто бывает необходимособрать класс из нескольких независимых кусочков. Дляэтого очень хороши трейты, но иногда их гибкости нехватает, например, для кастомизации case-классов.

Page 19: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Практический пример: LINQ

var db = new MyDbContext(connString);var products = db.Products;products.Where(p => p.Name.StartsWith("foo")).ToList()

Переменная products в этом примере имеет тип,унаследованный от IQueryable<Product>.

Метод Where доступен для всех коллекций стандартнойбиблиотеки .NET, но для IQueryable он перегруженмагическим способом, который говорит компилятору передатьв него не функцию-фильтр, а ее представление в виде деревавыражений.

В процессе жизненного цикла запрос накапливает в себеинформацию о вызванных методах типа Where и переданных ввиде деревьев параметрах, после чего по просьбе программиста(foreach, ToList и так далее) преобразует эту информацию взапрос к конкретному источнику данных.

Page 20: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Постановка задачиLINQ - неувядаемая классика нашего времени, так сказать,де-факто стандарт в области виртуализации запросов вмейнстримных языках программирования, поэтому хочетсяиметь что-то подобное в стандартной библиотеке Скалы.

В следующем разделе презентации мы увидим как при помощимакросов можно реализовать не только LINQ, но и кое-чтопоинтереснее - причем все это исключительно средствамиязыка, т.е. без внесения изменений в компилятор.

Кроме независимости от компилятора полученное решениеисправит некоторые фундаментальные ограничения LINQ,например, проблемы с композируемостью - все это благодарястрогости и ортогональности концепции макросов.

Page 21: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

План

Проект “Кеплер”

Макросы за 15 минут

Сценарии использования

Легковесные макросы для Скалы

Заключение

Page 22: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

LINQ на макросах

class Queryable[T, Repr](query: Query) {macro def filter(p: T => Boolean): Repr = <[

val b = $this.newBuilderb.query = Filter(query, ${reify(p)})b.result

]>}

val products = db.productsproducts.filter(p => p.Name.startsWith("foo")).toList

Page 23: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Макро-определенияКак можно заметить, вызов макроса filter в предыдущемпримере неотличим от вызова обычного метода. Этонеудивительно, ведь macro def читается как “макрос, которыйможет использоваться везде, где бы использовался def”.

Сигнатура макроса также прозрачно интегрирована в целевойязык программирования. Макросы исполняются во времякомпиляции, поэтому они принимают на вход и возвращаютисключительно нетипизированные AST. Однако спецификациитипов позволяют компилятору проверить корректность макросаи как можно раньше сообщить о возможных ошибках.

Кроме того, внутри макроса у программиста есть доступ ковсем переменным, которые составляют область видимости, втом числе к this и к неявным переменным. Для внимательных:да, в макросах перегружен метод implicitly[T].

Page 24: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Легковесные, но не убогиеИз-за своей легковесности макросы могут казатьсяограниченным хаком, но это не так. На самом деле, макросы -полноценные граждане языка и рантайма.

С одной строны, легковесность является синтаксическимсахаром, за которым скрывается обычная функция, котораяпринимает на вход несколько AST и возвращает AST на выход.С другой стороны, в процессе компиляции макросыпреобразуются в обычный байткод, который может бытьиспользован при сборке другой единицы компиляции.

Наконец, макросы могут использовать произвольныефункции/методы и загружать любые библиотеки. За примеромдалеко ходить не надо - reify из предыдущего листингаявляется обычной функцией AST ⇒ AST. Кстати, а что будет,если вместо ${reify(p)} написать reify($p)? Подсказкупосмотреть в черновике спецификации квазицитат.

Page 25: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Тайп провайдерыЯзыковая поддержка интегрированных запросов и фреймворктрансляции запросов хороши как вещи в себе, но кроме нихеще необходим способ отображения сущностей источникаданных на классы нашего языка программирования.

Это хорошо известная проблема в мире O/RM. Один из путейее решения заключается в использовании текстовойкодогенерации, другой - в ручном кодировании классов. Сейчасмы рассмотрим альтернативный подход, который стремительнонабирает известность: тайп провайдеры, разработанные вMicrosoft Research.

Идея тайп провайдеров заключается в том, чтобы во времякомпиляции генерировать классы для сущностей источникаданных (таблиц, сущностей XSD, записей LDAP). Если мыслышим “время компиляции”, значит, можно применитьмакросы.

Page 26: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Тайп провайдеры на макросах

macro class MySqlDb(connString: String) = ...type MyDb = MySqlDb("Server=127.0.0.1;Database=Foo;")

val products = new MyDb().productsproducts.filter(p => p.Name.startsWith("foo")).toList

Page 27: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Макро-типы. . . это не более, чем синтаксический сахар для старых добрыхмакросов, преобразующих AST в AST.

Этот вид макросов также принимает на вход AST и такжевозвращает AST, но возвращаемое выражение является непросто выражением языка, а полноценным определениемкласса. Здесь нет двойного дна - все действительно настолькопросто.

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

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

Page 28: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

МинимализмВначале я хотел развить идею macro чего-то и дальше ипоэтому обдумывал разные варианты: например, macro packageили macro annotation. Мартин был сильно против раздуванияязыка, и это заставило меня задуматься. Выяснилось, чтоможно обойтись только определениями и типами.

Скажем, для генерации большого количества классов(например, TupleN) можно написать macro object и потомимпортировать его в место использования. Для генерацииклассов в текущий пакет можно подмешать macro trait вpackage object.

Специальные макро-аннотации тоже имеют сомнительнуюценность, ибо их можно заменить обычными аннотациями, араскрытие макросов можно запускать, подмешивая вобъявляющий класс специальный macro trait.

Page 29: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

РезюмеI Наши макросы прозрачно интегрированы в язык

программирования. Макро-определения (macro defs)практически неотличимы от обычных определений,макро-типы (macro types) могут быть использованыпочти везде, где используются обычные типы.

I С помощью этих двух конструкций языка можноэффективно реализовать анализ кода, языковуювиртуализацию, а также победить некоторые видыдубликации кода, с которыми не справляютсятрадиционные парадигмы программирования.

I Наконец, макро-типы вкупе в механизмомквазицитирования предоставяют высокоуровневыйинтерфейс к кодогенерации.

Page 30: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

План

Проект “Кеплер”

Макросы за 15 минут

Сценарии использования

Легковесные макросы для Скалы

Заключение

Page 31: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

СсылкиI Project Kepler, Compile-Time Metaprogramming for Scala

https://github.com/xeno-by/kepler

I Живой журнал на русском, обновляется чаще всегоhttp://xeno-by.livejournal.com/

I Блогспот на английском, ретрансляция из ЖЖhttp://xeno-by.blogspot.com/

I Сборник познавательных текстов по макросамhttp://macros.xeno.by/

I Сайт языка программирования Немерлеhttp://nemerle.org/

Page 32: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

БлагодарностиПользуясь случаем, хочу выразить благодарность создателямязыка программирования Немерле за прекрасный источниквдохновения, а также Владу Чистякову, главному разработчикусовременного Немерле, за невероятно полезные дискуссии натему метапрограммирования времени компиляции.

Признаться честно, я просто восхищен Немерле. Этот языкпрограммирования - живое доказательство того, что возможнои практично иметь систему интегрированного в языкметапрограммирования в статически типизированном языке ссинтаксисом. Кроме того, Немерле является тестовым стендомдля активных исследований в области макрологии, что делаетего еще более интересным.

Наконец, большое спасибо всем, кто принимал участие вобсуждениях проекта “Кеплер” и своим взглядом со стороныпомог сделать дизайн макросов лучше.

Page 33: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Обратная связьХотел бы еще раз остановиться на том, как важно вашемнение.

Если после просмотра слайдов у вас возникли интересныеидеи, если вы знаете, как макросы помогли бы (или помогают)вам в ежедневной работе, не сочтите за труд поделитьсямыслями по адресу [email protected].

Макросы для Скалы все еще в процессе дизайна, поэтомуудачная мысль может радикально поменять ход проекта иизменить мир к лучшему. Или же, более банально, но не менееприятно: сделать конкретно ваш сценарий программированияболее продуктивным.

Page 34: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Вопросы и ответы[email protected]

Page 35: Проект“Кеплер”:макросыдляСкалыscalamacros.org/talks/2011-10-29-RuProjectKepler.pdf · Проект“Кеплер” Цель: Реализоватьмакросы,типобезопасныймеханизм

Метаморфные макросы

macro Cons is Exprsyntax expr1 : 11 "::" expr2 : 10;

{<[ @::(expr1, expr2) ]>

}

В отличие от обычных макросов, метаморфные макросы,работают на уровне парсера и грамматики языкапрограммирования. Они могут добавлять новыесинтактические конструкции или расширять уже существующиепродукции грамматики.

Во второй версии языка команда Немерле планируетреализовать полностью весь синтаксис на макросах. Наряду страдиционными описанием грамматики DSL заданиясинтаксиса также будет включать информацию о типизациипродукций. По сути, Немерле 2 будет метациркулярнымметакомпилятором.