6日目「インタプリタによる実行」

2012-03-04

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(
BasicInterpreter.class, args, BasicEvaluator.class);

しかしこのアスペクト指向ってのは、元のソースに全く触れずに拡張できるのは凄いな。こういう本で徐々に機能を拡張していくには持って来いだな。実際のプロジェクトで使えるのかは不明だけど。アスペクト指向を使わない場合には、サブクラス+Factoryメソッドてことになるのかな。