Alexander Kuklev (akuklev) wrote,
Alexander Kuklev
akuklev

Scala Improvement Proposal: Quotations and Implicit Unboxing

Preliminaries

Let's call a polymorphic type F[T] enveloping if it's equipped with eval: F[T] => T and reify: T => F[T] (reify often being a macro) satisfying eval(reify(expression)) ≡ expression and reify(eval(enveloped)) ≡ enveloped.

A typical and motivating example where reify is a macro is Expr[T]. Examples where no macros are involved are Future[T] (with await as eval) and Option[T] (with getOrElse {throw new NoValue()} as eval).

Autounboxing is the following behaviour: whenever a value of the enveloping type F[T] is found where a value of type T is accepted, eval is called implicitly. In homoiconic lauguages (including Scala), one can consider all written expressions to be initialy of the type Expr[T] and being autounboxed into T by omnious implicit autounboxing rule Expr[T] => T.

Proposal

We propose to introduce an instruction implicit[F] which enables autounboxing for F in its scope, and quotation brackets F<[expr]> which temporarily disable autounboxing.

Implicit contexts can be implemented by means of macros as follows: In every implicit[F]-scope the processing macro defines F.reify as an implicit conversion trom F[T] to T and applies F.eval to every occurrence of a symbol having or returning type F[T] which is defined outside of this implicit[F]-scope (symbols defined inside the scope are to be left alone). Code inside corresponding quotation brackets is excluded from processing.

Use cases

Code using futures and promises can be made much more readable by autounboxing. To take an example, one can look at Dataflows in Akka 2.0. This is how their code looks now:
flow {

  z << (x() + y())

  if (v() > u) println("z = " + z())

}

Using autounboxing this can be recast without any unintuitive empty paranthesis:
flow {

  z << x + y

  if (v > u) println("z = " + z)

}


The main purpose of this syntax is however to be understood in course of the scala purification programme, in which all mutable (volatile) values are distinguished on type level.
Tags: scala
Subscribe

  • (no subject)

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

  • Прогресс

    Десять дней назад, вторая ступень SpaceX'овского корабля Starship своим ходом слетала своим ходом на десять километров вверх, и усмепшно приземлилась…

  • О водосбережении

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

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 15 comments

  • (no subject)

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

  • Прогресс

    Десять дней назад, вторая ступень SpaceX'овского корабля Starship своим ходом слетала своим ходом на десять километров вверх, и усмепшно приземлилась…

  • О водосбережении

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