Ammonite ではじめるすくすく Scala 生活

だいたい Ammonite に書いてある。Magic Imports はとてもありがたい。

インストール

$ sudo curl -L -o /usr/local/bin/amm https://git.io/vdNv2 && sudo chmod +x /usr/local/bin/amm && amm

REPL として使う

$ amm
(... snip the greeting message ...)

@  "This is Ammonite REPL".split(" ").foreach(println)
This
is
Ammonite
REPL

REPL として使う + 外部ライブラリを追加する

$ amm
(... snip the greeting message ...)

@ import $ivy.`com.github.nscala-time::nscala-time:2.18.0`, com.github.nscala_time.time.Imports._
import $ivy.$                                           , com.github.nscala_time.time.Imports._

@ DateTime.now().toMutableDateTimeISO
res14: org.joda.time.MutableDateTime = 2018-01-18T20:53:19.347+09:00

REPL として使う + 外部ライブラリを起動時に読み込ませるように設定しておく

$ vi ~/.ammonite/predef.sc
import $ivy.`org.scalaz::scalaz-core:7.2.7`, scalaz._, Scalaz._
import $ivy.`com.github.nscala-time::nscala-time:2.18.0`, com.github.nscala_time.time.Imports._
$ amm
(... snip the greeting message ...)

@ (1.hour + 2.minutes + 34.seconds).getClass
res9: Class[T] = class com.github.nscala_time.time.DurationBuilder

コマンドとして使う(-c)

$ amm -c 'import scala.io.Source; val f = Source.fromFile("/home/kyagi/.gitconfig"); for(l <- f.getLines) { if(l.contains("checkout")) println(l); }'
Compiling /home/kyagi/bin/(console)
  cb = checkout -b
  co = checkout
  tg = "!f() { git checkout -b "$1" "refs/tags/$1"; }; f"
  yo = "!f() { git checkout -b "$1" "origin/$1"; }; f"
  yp = "!f() { git checkout -b "$2" "$1/$2"; }; f"

スクリプトを実行するインタプリンタとして使う (-s はサイレントオプション)

import scala.io.Source
import ammonite.ops._

@main
def main(str: String, path: Path): Unit = {
  val file = Source.fromFile(path.toString)
  for (line <- file.getLines) {
    if (line.contains(str)) println(line)
  }
}
$ amm -s MyGrep.sc branch /home/kyagi/.gitconfig
Compiling /home/kyagi/bin/MyGrep.sc
    ba = branch -ra
    bd = branch -d
    bD = branch -D
    br = branch
    bv = branch -vv

スクリプトを実行するインタプリンタとして使う + 別窓でスクリプトを修正したら自動実行

$ amm -s -w MyHello.sc
hello, wolrd
Watching for changes to 2 files... (Ctrl-C to exit) # 別窓で vi MyHello.sc して s/world/scala/ する
hello, scala
Watching for changes to 2 files... (Ctrl-C to exit)
...

-w オプションは sbt の ~run に相当する(Ruby でいう Guard)。٩(๑´3`๑)۶