monolithic kernel

意外と簡単だった Kotlin Scripting

July 16, 2022

公式のチュートリアルを見ると、IDEA を入れたり Gradle を持ち出したりと、全然お手軽に使えなさそうで敬遠していた Kotlin Scripting。スクリプト言語のようなノリで使えないか試してみたところ、そういう使い方もできそうだったのでメモ。

CLI コンパイラを使ってスクリプトとして実行する際のドキュメントは公式ドキュメントの別のページにあった。

> brew install kotlin
hello.kts
println("Hello, World!")
> kotlinc -script hello.kts
Hello, World!

ここまでが簡単なのは知っていたが、@file:Repository@file:DependsOn といったアノテーションでサードパーティのライブラリを使うためには、最初に挙げたチュートリアルのように Gradle を使うしかないと思っていた。しかし、どうやら CLI でも kotlin-main-kts というものを使って依存関係を記述できるらしい。

ポイントは拡張子を .main.kts にすること。.kts では kotlin-main-kts の機能を利用できない。ついでに、さっきまでは公式のドキュメントに習って kotlinc -script としていたが、単に kotlin コマンドでいけるらしい。

hello.main.kts
@file:Repository("https://maven.pkg.jetbrains.space/public/p/kotlinx-html/maven")
@file:DependsOn("org.jetbrains.kotlinx:kotlinx-html-jvm:0.7.3")

import kotlinx.html.*
import kotlinx.html.stream.*
import kotlinx.html.attributes.*

val addressee = "World"

print(
    createHTML().html {
        body {
            h1 { +"Hello, $addressee!" }
        }
    }
)
> kotlin hello.main.kts
<html>
  <body>
    <h1>Hello, World!</h1>
  </body>
</html>

ドキュメントからのコピペではなく、自分の使いたい好きなライブラリでもいける。

fastutil.main.kts
@file:Repository("https://repo1.maven.org/maven2/")
@file:DependsOn("it.unimi.dsi:fastutil:8.5.8")

import it.unimi.dsi.fastutil.ints.IntArrayList

val list = IntArrayList()
    .apply {
        add(1)
        add(2)
        add(3)
    }

println("list=$list")
> kotlin fastutil.main.kts
list=[1, 2, 3]

これなら使用感としてスクリプト言語に近いのではないだろうか。サードパーティのライブラリを使うのにあたって、依存の記述まで1ファイルで完結しているのはむしろ他のスクリプト言語でも真似してほしいくらい。

取っ掛かりとしては1ファイル作るだけでやさしくなったものの、ある程度書き進めていくと、やっぱり IDEA で書いたほうが早いんじゃないかという気持ちになってくる。ただ、そうなってからプロジェクトを作るというのも全然あり。

> idea fastutil.main.kts

idea コマンドで開いて、Project Structure で SDK の設定さえしてあげれば、build.gradle とかは用意しなくてもすぐに実行できる。当然 .idea ディレクトリが切られていろいろファイルが作られるものの、最悪その辺は捨ててもすぐ実行可能な状態に持っていけるので、.main.kts ファイルで完結する簡単さを台無しにしてしまうというほどではないかな。

Kotlin はスクリプト言語にそこまで劣らない記述量で、特に IDEA だと強力な補完も効くので、書き捨てじゃなくまた使いそう、くらいの温度感のスクリプトには Kotlin Scripting を使ってもよいかもと思っているところ。