Scalaの分離されている標準ライブラリなどを使うためのbuild.sbt設定コピペ集。
Parser combinator
build.sbt
libraryDependencies ++= Seq(
"org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.4"
)
code
import scala.util.parsing.combinator._
// 大体の場合はRegexParsersでOK
class MyParser extends RegexParsers { ... }
versionが変わってる可能性あるので、最新はこちらを確認してください。
Reflection
build.sbt
libraryDependencies ++= Seq(
"org.scala-lang" % "scala-reflect" % scalaVersion.value
)
code
import scala.reflect.runtime.universe._
def hoge[T]()(implicit tt: TypeTag[T]) = {
val t: Type = tt.tpe
}
Macro
Macroは別プロジェクトにしておかないと使えないので、大体の場合はサブプロジェクト化すると思います。
build.sbt
lazy val root = (project in file(".")).
dependsOn(macroProject)
lazy val macroProject = (project in file("macro")).settings(commonSettings:_*).
settings(
libraryDependencies ++= Seq(
"org.scala-lang" % "scala-reflect" % scalaVersion.value
)
)
code
import scala.reflect.macros.Context
import scala.language.experimental.macros
object MyMacro {
def myImpl(c: Context)
(arg1: c.Expr[Boolean], arg2: c.Expr[Any]): c.Expr[String] = {
import c.universe._
c.Expr(q"val a = 2;a.toString()")
}
}
// usage
def myFunc(arg1: Boolean, args: Any) : String = macro MyMacro.myImpl
Scala meta
Scala metaの場合は、compiler pluginを使用することになるので、その設定も必要です。
build.sbt
lazy val root = (project in file(".")).
dependsOn(scalaMetaProject)
lazy val scalaMetaProject = (project in file("scala-meta")).
settings(
libraryDependencies ++= Seq(
"org.scalameta" %% "scalameta" % "1.3.0"
),
addCompilerPlugin(
"org.scalameta" % "paradise" % "3.0.0-M5" cross CrossVersion.full),
scalacOptions += "-Xplugin-require:macroparadise"
)
code
import scala.meta._
import scala.collection.immutable.Seq
class MyMeta extends scala.annotation.StaticAnnotation {
inline def apply(defn: Any): Any = meta {
defn match{
case cls: Defn.Class => ...
case func: Defn.Def => ...
}
}
}
//usage
@MyMeta class ModifiedClass{
@MyMeta def hoge() = ...
}
metaは、アノテーションの形で使用します。そのため、アノテーションを付ける事のできるtrait,class,object,val,var,defなどほぼ全てのマクロ化が出来るようになっています。
最新バージョンや設定方法が変わっている場合は、ここを参考にすると良いです。
https://github.com/scalameta/tutorial
XML
build.sbt
libraryDependencies ++= Seq(
"org.scala-lang.modules" %% "scala-xml" % "1.0.6"
)
code
val xml = <hello>world</hello>
最新バージョンはこちらで確認して下さい。