PS

Macro

Constant expressions

Constant expressions SLS 6.24より、constant expressionとは(基本的に)以下のいずれかである: A literal of a value class, such as an integer A string literal A class constructed with Predef.classOf An element of an enumeration from the underly…

showCode

showCode Scala 2.11からshowCodeというすごいmethodが追加されており、 これは「コンパイル可能な文字列を返す」ということで、 c.TreeとStringが相互に変換可能になっている。 object Parse { def apply(x: String): Any = macro Impl.apply final class I…

shapeless.Lazy

shapelessのLazyを攻略する試み。*1 実装 implicitlyのためにmacroで実装される。quasiquoteを使うと trait Lazy[T] { val value: T } object Lazy { implicit def mkLazy[T]: Lazy[T] = macro mkLazyImpl[T] def mkLazyImpl[T](c: Context)(t: c.WeakTypeTa…

Type macro風のmacro

型を返すmacroがボツになり、 type t = typeOf("hello") と書けなくなったので替わりになるもののアイデアメモ。*1 その1 valを経由して val t = typeOf("hello") type t = t.unwrap とする。 その2 Annotation macroを使って @typeOf val t = "hello" と…

Scala 2.11(のmacro)

2.10辺りからの変更点 Untyped macroがなくなった。 替わりに文字列を使う。*1 Type macroがなくなった。 言語の見た目を拡張するのはよろしくない、という方針か。 どうエミュレートするか悩みどころ Contextがwhitebox.Contextとblackbox.Contextに分かれ…

Scala macro まとめ

Constructorとextractorがきっちり対応してないのがくやしい?感じである。 reifyやspliceは、q"..${x}.."が便利なので使わなくていいかもしれない。 当たり前?かも知れないが、型に相当するTree*1は、単独ではtypeCheckできない。 c.TYPEmodeが使える。 参…

Value types

Value type Scalaのコードで書ける型のこと(だと思う)。つまり、 type t = X のXに書けるようなものである。 Value typeはabstractとconcreteの二種類に分かれる。 Abstract value type Type parameterまたは(overrideされていない)abstract type memberのこ…

ConstantType

ConstantType Scalaには7.typeのような型(constant type)がこっそり含まれていた。macroで取り出して使うことができる。 object ConstantTypeOf { type apply[T](x: T) = macro impl[T] def impl[T: c.WeakTypeTag](c: Context)(x: c.Expr[T]): c.Tree = { i…

Inference-Driving Macros

Scalaのmacroについて・・・ Inference-Driving Macros ってどういうことだろうと思っていたが、Scalaのmacroは相当賢くて def apply(x: String) = macro vimpl def vimpl(c: Context)(x: c.Expr[String]): c.Expr[Any] = ... としてもちゃんと戻り値の型をmacr…

Compile-fail-test

Scalaの話 ずっと無くて困っていた「コンパイルに失敗したら成功」というテストが Scalaのmacroで簡単に実装できるようだ。 Testing for compiler errors with untyped macros. shapeless/core/src/main/scala/shapeless/test/typechecking.scala at master …