Custom AST Transformation で メモ化を試してみました

Groovy AST変換によるコンパイルメタプログラミングについて、調査を継続しています。

今日は、簡単なコードを書いてみました。コンパイル中に AST 変換を行い、任意のメソッドをメモ化できます。

とりあえず使用例を。

@Memoized
def fib(n) {
    if (n <= 1) return n
    else return fib(n - 1) + fib(n - 2)
}

上記のように、@Memoized とアノーテーションをつけると、そのメソッドがメモ化されるような Custom AST 変換を作ってみました。

AST変換動作の概要は、下記のような感じです。

  1. ノーテーションが付けられたメソッドを別名に変更する
  2. 元の名前でメモ化処理用のキャッシュ参照関数を生成する

ソースは gist におきました

現状では、1引数のメソッドにだけ対応しています。まだまだ Groovy での開発環境整備も出来ていない状況で、ろくにテスト/デバッグもできない有り様です。実際、ソースをご覧いただければ分かるとおり、メッセージボックスでデバッグメッセージを出しているという状態。というわけで、まずは環境整備を進めていこうと思います。

次回は、Custom AST コード開発におけるテスト環境などについて考えていきたいと思います。現状は、AST変換が楽しいので劣悪なテスト環境でも気にならないのですが、そのうちに嫌気が差してくるでしょうから。。。