LoginSignup
1
3

More than 5 years have passed since last update.

sbtのいろいろな最小構成設定(コピペ用)

Posted at

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>

最新バージョンはこちらで確認して下さい。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3