2007-08-01から1ヶ月間の記事一覧

Reachの解析

ふと思った。どうしてバイトコードエンジニアリングでcall-by-need的なチューニングするフレームワークがないんだろう。 LOG.debug(MessageFormat.format(...));

snippet compiler

粘着snippet。スニペットが否定されるなら、そのコンパイラ作ればいいだけじゃないか。 List<IqConstraint> snippets = new ArrayList<IqConstraint>(); // cast.type = T // cast.expression = a snippets.addAll(Snippet.compile("cast", "($T) ($a)", context.expression())); // over</iqconstraint></iqconstraint>…

Local Variable "Drive"

DependencyでもInjectionでもないのでDriveする。 public static void main(String[] args) { @Drive String a = "drive [a]"; System.out.println(a); @Drive("message") String b = "drive [message]"; System.out.println(b); } @Driveが付いたローカル変…

白魔術師

スニペットが評判悪すぎですよ。 スニペットに走る前に、HackパラメータのDOMジェネリックス型にextendsとsuperとの型引数動作をきちんと実装したほうがいいな。 -黒魔術 - まさたか日記 いえす。ただしパラメータドライブ+ジェネリックスでは、微妙にあい…

スニペットと未加工型

/** * @when * elem.spec = {@link ArrayList#ArrayList(int)} * elem.arguments = (1) */ こういう場合だとスニペットだと表現しにくいかも。 /** * @when * elem = {@snippet new ArrayList<$T>(1)} */ と見せかけて、上記は new ArrayList(1) という未加…

進化モデルに学ぶOSS開発モデル

生物の進化モデルを情報科学で応用した例に、遺伝的アルゴリズム(GA)とか遺伝的プログラミング(GP)などがあります。大まかに言うと、適当な情報を遺伝子とみなして、その遺伝子を進化させることによってよりよい情報を得るような手法です。

reconcile時の構造デルタ

id:taichitaichi の人と歩きながら話してた内容の備忘録。 ●ボタンを押すと操作のレコーディング開始。その時点のASTをinitとする レコーディング中にreconcileが発生すると、前回のASTから変更された部分の差分を抽出 ●から■までの操作差分 delta を作る in…

[Irenka] 名前募集

public class Hoge { public Hoge() { this("hogehoge"); // (1) } public Hoge(String s) { super(); // (1) System.out.println(s); } public static void main(String[] args) { new Hoge(); // (2) } } (1), (2)のDOMでの名前で悩んでます。

like a snippet

今の時点でもいえることは、rule一発で終るような「($T)$a => $a::$a instanceof $T;」のようなものはJackpotのほうが手数が少ない。一方で、@Overrideアノテーションをコードに書き込むようなものは圧倒的にIrenkaのほうが楽だ。できることを説明した概要…

メモ

public interface Cursor<E> extends Iterable<E>, Iterator<E> { void sendDelta(); } /** * @sql.select * where {@link HogeEntity#a} = a */ Cursor<HogeEntity> get(int a);</hogeentity></e></e></e>

開発体制とその理想

未踏キックオフミーティング用、なぜOSSなのかとか。 もうちょいまとまったら書く予定。

IDocumentとIProgressMonitor関連

某カンファレンス中にちょろっと話した内容をまとめていただいたようで。 重要なのは、JDTのモデルを触る時には、以下の点について考慮しないといけない事です。 現在エディタで開かれているかどうか ファイルの実体を変更するかどうか。つまり、エディタ上…

ファイラ

上で出てきたファイラの説明がそういえばなかったので追記。ファイラは上記ファイルシステムへのアクセサの役割を果たします。現在は「ファイルシステム」として設計していないので、ファイラの見せるリソースこそがファイルシステムとなっている状態です。…

Irenka仮想ファイルシステム

id:ashigeru:20070815:1187182109 でファイラの最低限の機能を実装してみましたけど、やっぱり仮想ファイルシステムが欲しいなと。

ファイラ

まだストリーム開けるだけ。 /** * @when */ public void always(Filer filer, CtClass klass) throws IOException { // 宣言以外はいらない (1) if (!klass.isMaster()) { return; } CtFolder folder = filer.getFolder("sample/tmp/filer"); // (2) CtFile…

定数式

どうもIBM系のJavaコンパイラと同じ動きしなくてはまっていた点。 プリミティブ型のリテラルと文字列リテラルは定数式 定数式同士の比較は定数式 定数式同士の文字列連結演算(+)は定数式 定数式だと何が嬉しいのかというと、定数式の数値は代入変換の際にナ…

クエリ構文の拡張

現在のIrenkaのクエリは、2つのプレースホルダ間の制約関係について 同一である: U = V (UとVは同一の制約を負う) 同一なものを含む: U in V の2つしか検証できない。ということでrelationshipに関する演算子をいくつか新規提案。

EnumConstantの初期化と解釈(メモ)

public enum Hoge { A, B(1), C { public String toString(){ return "c"; } }, D(1) { public String toString(){ return "d-1"; } }, ; ... } 上記のような列挙型をJavaで宣言したと仮定して、A~Dの「値」についてどう扱うか考えてました。

AST/Eclipseのはまった点

InfixExpression#extendedOperands()同じ演算子で3項以上続く場合(a + b + cなど)、第3項以降がextendedOperandsに格納されて1つのInfixExpressionとして表現されるみたい。5月のデモのときにも「+が2個以上続くと消えます」と申し添えておきましたが、こん…

こんな感じで、@whenが動く時に、プロセッサのフィールドに、 処理対象リソースの@whenで指定したパスとは違うパスのノードを格納しておいて欲しいデス。 要望。 - 設計と実装の狭間で。 仕込みを入れれば対応できそうな予感。

CtCompilationUnitInfo

id:ashigeru:20070808:1186594490 の問題を解決。DeclarationFactoryImpl#loadTopLevelType(String) 経由で解決した型に関してはCtCompilationUnitが付与されます。 横断的に修正した+テストが甘いので退行が怖いです。や、それにしてもCtCompilationUnitと…

DOMの構築

今後ぶれないためにも微妙に書き記しておく。コンパイラ・フレームワークを(コア)ユーザが使いたがらない理由の一つに、DOM(AST)を生成するのが面倒だから、というのがあるかなと思います。 たとえば、下記のコード片をEclipseのASTで生成する場合を考えます…

CompilationUnitの同一性

id:taichitaichi:20070808:1186583849 結局の所、DeclarationFactoryImpl#loadTopLevelTypeで生成されたCtClassMasterに、CtCompilationUnitはセットされない。

はてなスター

って、もらえると地味にうれしいです。というはなし。大学院生のころに、「ソフトウェアはおもちゃのようであるべきだ」という議論を博士課程の先輩としてました。 それによると: 見た目がきれいであること 操作が単純で、十分にアフォードされていること …

でぐれ

すいません微妙にデグレってます。 /** * src = {@link #source()} * dst = {@link #target()} */ public void copy(CtMethod src, CtMethod dst) { dst.getBody().substitute(src.getBody()); } public void source() { // source System.out.println("Hell…

現状報告:ソースコードの置換

/** * @when * m.parameters.type = ( {@link String} ) * private in m.modifiers * a in m.annotations * a.spec = {@link Deprecated} */ public void suggested(LiteralFactory literals, CtMethod m, CtAnnotationInstance a) { a.substitute(null); } …

自賛

この設計が当たりだったかもという。 /** * method.parameters.type = ({@link String}, {@link String}) */ public void hack(CtMethod method) これは下記と等価です。 /** * method.parameters[0].type = {@link String} * method.parameters[1].type = {…

トランザクション管理

/** * @when * access.variable = field * field = {@link CtField} * {@link ThreadLocalize} in field.annotations.spec */ public void hack(CtVariableAccess access) accessは変数へのアクセス (引数 CtVariableAccess accessから推論) accessの属性"va…