PS

Scala

Scaladoc の syntax

俺様 scaladoc.vim を作成中に出くわした Scaladoc の syntax の(知らなくてよさそうな)仕様について・・・ Left mergin Left mergin とは *のあとに空白があったら、その次の文字 *のあとが空白でなければ、その空白でない文字 それ以外は、行頭の文字 /** * M…

Scala の syntax

俺様 scala.vim を作成中に出くわした Scala の syntax の(知らなくてよさそうな)仕様について・・・ Unicode escape \u1234のような形は tokenize に先立ち unicode文字にエスケープされる: val \u0061b = 3 // val ab = 3 uは何個ついてもok: val \uuuuuu0061…

Path にまつわる型推論

型推論クイズ - PS とはかけ離れたかもしれない怪しいレポート。 準備 以下の記事は、Scala 2.11.4 および Scala言語仕様 (pdf) (以下、SLS) の June 11, 2014 版を使用しています。また、scala.Singleton - PS に誤りがあり訂正しているので合わせてご覧く…

型推論クイズ

この投稿は Scala Advent Calendar 2014 - Qiita の24日目の記事です。 前の日の記事: Scala - spray-routingにPlay2ライクなコントローラを導入する - Qiita 次の日の記事: L'Architecture systèmatique [JP]: Patterns on Scala この記事についてのレポー…

Scala vs. Javaのconstant expression

Javaにて 15.28. Constant Expressionsを参照。 Scalaにて ほとんどのmethod呼び出しは、platform依存ということになっている。 ・・・のだが、実装上は上記のJavaの仕様に従うと思われる。 Arrayがconstant expressionにならない。 Scalaでも仕様上constant ex…

String interpolationによるextractor

Processed string literalの展開 foo"t0${x1}t1 ... ${xn}tn" は、 new StringContext("t0", "t1", ... , "tn").foo(x1, ..., xn) のように展開される・・・のだが、これが有効な式でさえあればよいらしく、 extractorも返せてしまうようだ。*1 例 implicit cla…

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…

scala.Singleton

scala.Singletonって何?という話 エラーメッセージによると、scala.Singletonはfinal traitでありextendsできない。 Path Scala言語仕様(以下SLS) 3.1より Paths are not types themselves, but they can be a part of named types ... ざっくり言うと、val…

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が使える。 参…

Type projection

Type projection SI-3443にさらっとtype projection: は、 と同値である、と書いてある。一方、言語仕様には しかないようで、コンパイラも にはエラーを出す。 class T { class A } type `_.A` = x.A forSome { val x: T } implicitly[`_.A`

Value types

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

Kind generalization

Type-level generics Scalaでは、type-level generics(勝手にそう呼んでいた)が動かないのだが、 おおもとはSI-3443にあるようだ。たとえば trait TypeFunction { type Domain type Codomain type apply[x

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 …

Path dependent type

Abstract type member Scalaでは、abstract type memberとtype projectionを使ってtype family を作ることができる。 object PathDepType { trait K { type A // abstract type member } trait a extends K { override type A = Int } trait b extends K { o…