Doma 1.28.0 をリリース

Doma 1.28.0 をリリースしました。

ダウンロードはこちらからどうぞ。

Mavenをご利用の方はこちらを参照ください。

以前のバージョンから移行するには移行ガイドを参照ください。

今回は、小さめの改善のみを含んでいます。

リリースノート

Improvement

  • [DOMA-277] - [Core] 注釈処理によるソースコード生成で利用したDomaのバージョンと実行時のDomaのバージョンが同じであることを検証する処理を抑制可能にしました

DOMA-277について解説

Domaの注釈処理によって自動生成されるソースコードは、次のようなstatic初期化子を含んでいます。

    static {
        org.seasar.doma.internal.Artifact.validateVersion("1.28.0");
    }

文字列リテラルで示された"1.28.0"は、注釈処理(コード生成時)に使ったDomaのバージョンです。
このstatic初期化子は、アプリの実行時に評価され、コード生成時のDomaのバージョンが実行時のDomaのバージョンと同じであるかどうかを検証します(異なればエラーになります)。

なぜこのような処理を組み込んでいるかというと、注釈処理関連の設定ミス(EclipseでFactory Pathの更新忘れなど)に気づきやすくするためです。


今回の修正では、上記のstatic初期化子のコード片を生成しないことをオプションで選択可能にしました。主な用途は、Domaで自動生成されたコードをライブラリとして配布する場合です。これまでは、ライブラリにしてもDomaの特定バージョン(ライブラリの生成に使ったバージョン)でしか動作させられませんでしたが、今回追加された機能を使うことで、Doma本体に非互換な処理が入らない限りは、バージョンの縛りがなくなります。


バージョンチェックのstatic初期化子のコード片を生成を抑制するには、注釈オプションのversion.validationにfalseを設定します。

F#でインタープリタ : 配列

配列が使えるようになりました。実装はF#のリストですけど。

次のスクリプトを解釈させると

a = [2, 3, 4]
print(a[1])
a[1] = "three"
print("a[1]: " + a[1])
b = [["one", 1], ["two", 2]]
print(b[1][0] + ":" + b[1][1])

こんな出力になります。

3
"a[1]: three"
"two:2"


多次元配列の扱いが難しかった。。。
以下のコードは値(value)を配列に代入するところです。

    | Element(id, indexList, Array(elements)), value ->
      let rec loop elements indexList =
        match indexList with
        | x :: [] ->
          elements 
          |> List.mapi (fun i element -> 
            if i = x then value else element)
          |> Array
        | x :: xs ->
          elements 
          |> List.mapi (fun i element -> 
            if i = x then 
              match element with
              | Array elements -> loop elements xs
              | _ -> failwith "invalid index"
            else 
              element)
          |> Array
        | _ -> failwith "invalid index"
      let array = loop elements indexList
      let newEnv = Env.add id array env
      cont newEnv value

配列の要素を表す判別共用体(Element)に、配列の変数名(id)、インデックスのリスト(indexList)、配列を判別共用体(Array)を持たせています。
ネストした配列の中をトラバースして、代入先の要素を入れ替えています。