?

Log in

No account? Create an account

Excelsior

Jun. 25th, 2013

12:01 am - Why not be dependently typed?

МакБрайд про зависимые типы в Хаскелле: http://stackoverflow.com/questions/12961651/why-not-be-dependently-typed/13241158#13241158 + свежая папера его же на ту же тему: http://www.reddit.com/r/haskell/comments/1gz03w/hasochism_the_pleasure_and_pain_of_dependently/.

Еще понравилась цитата: "Dependent types make a lot of people nervous. They make me nervous, but I like being nervous, or at least I find it hard not to be nervous anyway" :)

May. 30th, 2013

06:37 pm - Applied Materialization: When Macros Meet Implicits (Bay Area, June 13)

A prominent peculiarity of Scala macros is the fact that they are very good at synergizing with the language features and the type system of vanilla Scala. The most impressive example of such a synergy are implicit macros that combine the flexibility of implicits and the code generation power of compile-time metaprogramming without compromising understandability and type safety.

We will start off with a simple serializer and will look into ways of generalizing it without sacrificing performance. That's going to be a good occasion to get acquainted with macros and learn a trick of two from macrology 101. With macros we will be able to match the performance of handcrafted serializers without going through the trouble of actually writing the boilerplate code.

Having familiarized ourselves with macros, we will push the boundaries of conciseness by using materialization, a new technique introduced in Scala 2.10.2. With a couple of materializing macros in place, the amount of code necessary to make a class serializable will be reduced to absolute zero.

Finally we will conclude with the details of interaction between materializers and type inference and how that allowed us to address a couple of challenging theoretical problems. Interestingly enough, this esoteric concept plays an important role in the design of macros 2.0 scheduled for Scala 2.11+.

http://www.meetup.com/Bay-Area-Scala-Enthusiasts/events/121848382

P.S. Huge thanks to juan_gandhi for organizing the meetup!

Tags: ,

May. 20th, 2013

06:50 pm - Как оно в Штатах без машины?

После конференции в Сент-Луисе я думаю на неделю-две взять отпуск и поездить по Штатам, т.к. это будет моя первая возможность основательно посетить США. Единственная проблема заключается в том, что водительских прав у меня нет и не предвидится. Насколько сильно это сокращает возможности? Имеет ли вообще смысл рассчитывать нормально попутешествовать без машины?

May. 18th, 2013

08:40 am - Evolution of Scala Macros (Strange Loop 2013)

Let’s take a journey to the internals of Scala macros!

We will start off in the early days of macros in Scala and the initial design of def macros, which ended up in the production release of Scala 2.10. We will also take a look at the popular use cases and patterns characteristic for our macro system.

Afterwards we are going to learn about macro paradise, a spawning pool for the new ideas, and get acquainted with its inhabitants: type macros, untyped macros, inference macros, jitted macros and macro annotations. Then, in the next act our new friends will try to make it into Scala 2.11, only to be stopped by the keepers of the Scala typechecker.

The narration will culminate when in addition to discovering a threat coming from the new macros, we find out that Scala 2.10 is already infiltrated. After the two forces collide, the next generation of macros in born, having two faces: blackbox macros and whitebox macros.

The next generation of macros brings peace to the macroland, and happiness ensues. But in the meanwhile, far away in macro paradise, macro annotations are getting mature, planning to try their luck in 2.12…

https://thestrangeloop.com/sessions/evolution-of-scala-macros

May. 7th, 2013

11:06 pm - Зачем нужны имплисит макросы?

И в недавней папере и во вчерашнем посте про новые макро фичи в 2.10.2, я упоминал имплисит макросы. Это все хорошо, но очень эзотерично, поэтому наверняка у вас возник вопрос о смысле существования таких макросов. Сегодня я постараюсь наглядно объяснить.

Когда макросы только начинались, и у нас еще даже не было разделения на macro defs и macro impls, весьма интересным занятием было помечтать: "а что если сделать макро типы?", "а что если сделать макро пакеты?" и так далее. Поэтому довольно быстро мы сообразили, что нужно будет поэкспериментировать с тайп макросами и макро-аннотациями, а, например, макро пакеты не особо и нужны, т.к. они эмулируются тайп макросами, и так далее.

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

А потом мы поняли, и с этого момента имплисит макросы стали моей любимой фичей Скалы. Итак, имплисит макросы нужны для автоматической генерации инстансов тайп классов. Есть еще несколько прикольных применений, но там именно что прикольно, а материализация тайп классов это фундаментально. Read more...Collapse )

Tags: ,

May. 6th, 2013

08:06 pm - Новые возможности макросов в 2.10.2

С того момента, как мы приняли драконовские правила бинарной совместимости для 2.10.х (теперь совместимость должна работать и назад, и вперед), я немного приуныл, ведь это означало то, что новые фишки и даже багфиксы для макросов из macro paradise будет практически невозможно портировать на 2.10.х.

Но, как оказалось, ситуация далеко не такая плачевная, и в 2.10.2-RC1, который запланирован на 13 мая, удалось впихнуть два очень значительных улучшения: квазицитаты* и имплисит макросы**. Можно или подождать официального релиза 2.10.2, который, по идее, случится в этом месяце, или уже прямо сейчас заюзать сборку 2.10.2-SNAPSHOT: http://docs.scala-lang.org/overviews/macros/paradise.html#macro_paradise_for_210x.

* Квазицитаты требуют некоторых плясок с бубном, но зато работают даже в 2.10.0.
** Имплисит макросы уже одобрены Адриааном, что очень хорошо, но пока что еще не смержены, так как пулл реквест пока что никто не заревьюал: https://github.com/scala/scala/pull/2494, поэтому сохраняется некоторая низкая вероятность, что случится что-то экстраординарное, и в релиз они не попадут.

Tags: ,

Apr. 29th, 2013

09:50 am - Google Summer of Code по sublime-ensime

Есть ли желающие поучаствовать в доработке легковесного IDE-like Скала плагина для Sublime Text в качестве проекта на Google Summer of Code?

Мы с коллегой уже довольно прилично наколбасили, поэтому основы уже работают (поддержка sbt, подсветка ошибок, комплишены, go to definition). Теперь пришло время реализовать дебаггер и рефакторинги, а заодно и портировать плагин на Sublime Text 3. Кто хотел бы этим заняться?

Tags:

Apr. 23rd, 2013

09:46 am - Let our powers combine!

Только что засабмитил паперу на воркшоп Scala 2013: http://scalamacros.org/news/2013/04/22/let-our-powers-combine.html.



Работа состоит из двух содержательных частей, не считая введения, быстрого знакомства с макросами и заключения. В первой части (Section 3) рассказывается про разные виды макросов (def macros, type macros, macro annotations), необходимость в которых проистекает из-за наличия в Скале синтаксиса, а также про их разновидности, возникающие на пересечении с тами или иными языковыми фичами. Во второй части (Section 4) рассматриваются сценарии использования макросов из первой части в сравнении с альтернативными подходами из других фреймворков и языков:
* Виртуализация языка
* Тайп провайдеры
* Автогенерация инстансов тайпклассов
* Упрощение программирования на уровне типов
* Интеграция с внешними доменно-специфическими языками
* Реализация новых языковых фич

Уважаемым читателям моего журнала папера может быть интересна в контексте обсуждений на следующие темы:
1) Вот я юзаю Скалу, и все ок. Зачем мне могут понадобиться макросы? (см. раздел 4. примеры там несколько ориентированы на академию, но большинство из них все равно взято из практики)
2) Зачем в Скале макросы, если уже есть scala-virtualized и LMS? (см. раздел 4.1)
3) В Скале слишком много фич, поэтому метапрограммирование там неоправданно усложнено (см. всю паперу на тему сценариев использования макросов, которые стали возможны благодаря тем или иным фичам Скалы)
4) Скале нужно метапрограммирование потому, что она недостаточно хорошо продумана (см. в принципе весь раздел 4, но в особенности 4.3 и 4.4, еще можно нагуглить технический отчет по Yin-Yang из списка литературы и почитать его)

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

Tags: ,

Feb. 23rd, 2013

05:59 pm - Are Lisp-style macros a code smell? (via reddit)

http://www.reddit.com/r/haskell/comments/1929xn/are_lispstyle_macros_a_code_smell/

Feb. 19th, 2013

10:07 pm - макро аннотации

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

13:29 ~/Projects/Kepler_introduce-member/sandbox$ cat Macros.scala
import scala.reflect.macros.Context
import language.experimental.macros

object Macros {
  def impl(c: Context)(target: c.Tree, name: c.Tree, code: c.Tree) = {
    import c.universe._
    val Literal(Constant(targetType: Type)) = c.typeCheck(target)
    val Literal(Constant(methodName: String)) = name
    val Function(methodParams, methodBody) = code
    val method = DefDef(NoMods, TermName(methodName), Nil, List(methodParams), TypeTree(), methodBody)
    c.introduceMember(targetType.typeSymbol, method)
    c.literalUnit
  }
  def addMethod(target: _, name: String, code: _) = macro impl
}
13:29 ~/Projects/Kepler_introduce-member/sandbox$ cat Test.scala
class C
object Test extends App {
  Macros.addMethod(classOf[C], "foo", (x: Int) => x + 2)
  println(new C().foo(2))
}
13:29 ~/Projects/Kepler_introduce-member/sandbox$ scalac Macros.scala && scalac Test.scala && scala Test
4
Если вкратце, в scala.reflect.macros.Context я добавил метод introduceMember, который может в любой компилируемый в текущий момент класс (а также трейт или объект) добавить любой мембер (метод, поле, вложенный класс и т.д.). То, что уже скомпилировано в байткод, менять, конечно, не получится - мы ж тут не магией занимаемся, в конце концов. Впрочем, это еще цветочки. В принципе, субботнее озарение позволяет реализовать не только скромное добавление новых мемберов, но и изменение и удаление старых, переколбас компаньонов и так далее.

А теперь вопрос. Вот есть полная свобода метапрограммирования, описанная выше. Если честно, я немного в растерянности. Вообще-то, с этой недели я планировал забить на время на девелопмент и сесть за написание паперы, а оно на выходных само взяло и наколбасилось. Что теперь с этой свободой делать? Что бы вы реализовали в первую очередь?

Navigate: (Previous 10 Entries | Next 10 Entries)