kmizuの日記

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

初学者向けの Scala Tips (7) - objectで名前空間を作る

たとえば、プログラミング言語のパーザを書いていて、プログラムの木構造を次のように表現したいとします。

sealed trait Expression
case class Addition(lhs: Expression, rhs: Expression) extends Expression
case class Subtraction(lhs: Expression, rhs: Expression) extends Expression
case class Multiplication(lhs: Expression, rhs: Expression) extends Expression
case class Division(lhs: Expression, rhs: Expression) extends Expression
case class Number(value: Int) extends Expression

これで問題はないのですが、Expressionはよく使われる単語なので、プログラムの他の部分と衝突する可能性があります。幸いScalaにはpackageがあるので、

package ast
sealed trait Expression extends Expression
case class Addition(lhs: Expression, rhs: Expression) extends Expression
case class Subtraction(lhs: Expression, rhs: Expression) extends Expression
case class Multiplication(lhs: Expression, rhs: Expression) extends Expression
case class Division(lhs: Expression, rhs: Expression) extends Expression
case class Number(value: Int) extends Expression

とすることは可能ですが、もっとわかりやすい方法として、objectで包むという方法が考えられます。上の定義をobjectを使って書き換えると、

object Ast {
  sealed trait Expression
  case class Addition(lhs: Expression, rhs: Expression) extends Expression
  case class Subtraction(lhs: Expression, rhs: Expression) extends Expression
  case class Multiplication(lhs: Expression, rhs: Expression) extends Expression
  case class Division(lhs: Expression, rhs: Expression) extends Expression
  case class Number(value: Int) extends Expression
}

のようになります。参照するときは、Ast.ExpressionAst.SubtractionのようにすればOKです。

ではでは。