kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Rubyっぽく楽にIO処理を書けるライブラリScaruby 0.3をリリースしました

Scalaは標準IOライブラリが非常に貧弱な言語です。scala.ioはまともに使えるものではありませんし、JDKのライブラリのIOを使うのも面倒です。そこで、サードパーティのIOライブラリを使うことになります。そこで、いくつかサードパーティのIOライブラリを見てみたところ、いずれも自分のやりたいことをぱっとできるように思えなかったので、自分で作ってみることにしました。

なお、better-filesは、自分の要求に一番近かったですが、java.ioやjava.nioがインタフェース部に露出しているのがあまり好みではありませんでした。

そこで、

  • java.ioがインタフェースに露出しない
  • Rubyのように簡単なIO処理が簡単に書ける
  • リソースの後始末は可能な限り簡単に
  • 多数のリソースをネストせずに扱える
  • オーバーロードをしない(!)

を目標として、新しいライブラリScarubyの開発を始めました(Scala + Rubyというネーミングです)。これまでで、とりあえず簡単なファイルI/OやURLからのテキスト読み込みなどが動作するようになったので、公開することにしました。

サンプルプログラムのいくつかは以下のサイトに置いてありますが、ドキュメントの充実はまだまだこれからということです。

github.com

たとえば、次のようなプログラムが動作します。

import com.github.scaruby._

val content = SFile.read("file.txt")
import com.github.scaruby._

val input = "Hello, World!"
val encoded = SBase64.encode64(input.getBytes("UTF-8"))
val decoded = new String(SBase64.decode64(encoded), "UTF-8")
assert(input == decoded)
import com.github.scaruby._
val content = for { 
  r <- SURL("https://srad.jp/").openReader
} r.readAll()
println(content)
import com.github.scaruby._
println(SURL("https://srad.jp").read())
import com.github.scaruby._
SFile("file.txt").read()
import com.github.scaruby._
SFile("output.txt").write("HogeFuga")

今後の予定としては、

  • JSONエンコーダ/デコーダの追加(他に依存しないもの)
  • その他のファイルフォーマットの対応

などを考えています。要望があればIssueに上げていただければ励みになります。