浅海 智晴(あさみ ともはる)
 最近はすっかりScalaプログラマ。代表作はXML SmartDoc(XML文書処理システム),Relaxer(XML/Javaスキーマコンパイラ)。現在はScala DSLモデルコンパイラSimpleModelerを開発中。近著は「上流工程UMLモデリング」(日経BP),「マインドマップではじめるモデリング講座」(翔泳社)。モデル駆動開発×クラウド・コンピューティングの研究プロジェクトedge2.cc(Edge to Cloud Computing)を中心に活動中。
本記事の目次
  1 はじめに
2 例題 2.1 コンパイル 2.2 アプリケーション
3 DSLの説明 3.1 クラス宣言 3.2 基本情報 3.3 申請情報 3.3.1 字句上の工夫 3.3.2 by-nameパラメタ 3.3.3 施設と設備 3.3.4 同時使用
4 JSON,XMLとの比較 4.1 JSON 4.2 XML
5 メインルーチン
6 DSLの基底クラス 6.1 インスタンス変数 6.2 implicit conversion 6.3 メソッド
7 Candidate 7.1 流れるようなインタフェース
8 Enumeration
9 HTML生成器 9.1 XMLリテラル 9.2 時間
10 HTML
11 まとめ

1 はじめに

 本記事では,Scalaをホスト言語としたDSLの定義と,このDSLを処理するプログラムの作成方法について,例題を用いて説明します。今回は「5 メインルーチン」までを,次回は「6 DSLの基底クラス」以降を掲載します。

2 例題

 Scala DSLの例題として,公共施設の利用申請書をScala DSLで作成してみましょう。App20090505.scala(リスト1)はScalaをホスト言語とした内部DSLによる公共施設の利用申請書です。

リスト1●App20090505.scala
package data

import scala.collection.mutable.ArrayBuffer
import scala.xml.Node
import app._
import app.施設区分._
import app.設備区分._

case class App20090505() extends 施設利用申請書 {
  会員番号 = 123456
  名前 = "Scala太郎"
  理由(<div>Scalaの勉強会を行うため。</div>)
  理由("Liftも少し取り上げるかもしれません。")

  申請 {
    施設(20090601, 1300, 1400, 講堂) 理由は <div>初日は講堂で講演したいから</div>
    同時利用(20090602, 1000, 1200) {
      施設(第1会議室)
      施設(第2会議室) 理由は "第1会議室だけだと足りないから"
      設備(ホワイトボード) 個数は 2 理由は "会議室ごとに利用"
    } 理由は """両方同時に利用希望します。片方だけだと入りきらないので。"""
  }
}

 申請者の会員番号,名前と施設や設備の申請内容をテキストで記述しています。内容の詳細は後ほど説明しますが,このテキストを見るとおおよその内容はわかると思います。