「2週間でできるスクリプト言語の作り方」の続き。環境(ハッシュ)を作って、構文木にeval()
メソッドを追加して評価する。
ここでは今までのソースを直接書き換えるんじゃなくて、GluonJというのを使って拡張している。アスペクト指向?とかいう手法で、@Reviser
というアノテーションで元のクラスを書き換える。書き換えると元のクラスのインスタンスを生成しようとすると、自動的に書き換えられたクラスのインスタンスが生成される。
書き換え後のメソッドeval
を呼び出すにはキャストが必要(GluonJコンパイラなら必要ないとのこと)。Rubyだとオープンクラスだから簡単にできるらしい。
ライブラリgluonj.jarは、Eclipseではプロジェクトの Property > Java Build Path > Libraries の Add External JARs… で追加する。
実行しようとするとキャストエラーが発生する。ASTreeEx
オブジェクトじゃなくてASTree
オブジェクトが作られてる様子。と思ったら、実行にはGluonJ専用の書き換えが必要だった:Runner.java
javassist.gluonj.util.Loader.run( |
しかしこのアスペクト指向ってのは、元のソースに全く触れずに拡張できるのは凄いな。こういう本で徐々に機能を拡張していくには持って来いだな。実際のプロジェクトで使えるのかは不明だけど。アスペクト指向を使わない場合には、サブクラス+Factoryメソッドてことになるのかな。