2018-01-01から1ヶ月間の記事一覧

sealed abstract case classがすごい

sealed abstract case classなるものがある。別のことを調べてたらこちらの記事(のコメント欄)で見掛けて感動してしまった。 軽く触れると、newできなくなり、case classによって自動で生成されるcopyメソッド、そしてコンパニオンオブジェクトのapplyメソ…

Scalaマクロのerrorとabortの違い

Scalaのマクロで、コンパイルエラーにしてしまうときは Context.error を使う。 def someMethod_impl(c: Context)(arg: c.Expr[String]): c.Expr[Unit] = { // ... if (cond) { c.error(c.enclosingPosition, "a message") } // ... } でもこれが微妙に使い…

Scala dynamics + macros

Type Dynamic Scalaはメソッドなどの有無をコンパイルの時点で解決しますが、Dynamic traitを使うことによって動的にすることが出来ます。 // Dynamic traitを使うために必要。コンパイラオプションに `-language:dynamics` を渡してもOK import scala.langu…