Index

BackQuote plug-in users manual


lisp が持つ backquote macro の機能が、 plug-in として提供されています。 これによって、抽象構文木を見やすい形でソースコード中に 埋め込むことができます。 例えば、
	Tree t = `(+ (id x) (id y));
は、次のコードと同じです。
	Tree t = new Tree(:+, new Identifier(:x), new Identifier(:y));
tree.print() で出力した結果は、 そのままカットアンドペーストして、バッククォート "`" のうしろに 書くことで、ソースコード中に埋め込めます。 (入力ミスなどを防ぐためにもカットアンドペーストでの入力をお勧めします。)

lisp の backquote macro と同様に、 コンマ "," や コンマ・アットマーク ",@" が使えます。 "," は、その後ろに続く Java の式の値を評価した結果を tree に埋め込みます。 ",@" は、その後ろに続く Java の式の値を評価した結果を Tree の配列と見なして tree に埋め込みます。 例えば、

	Tree t = `(+ (id x) ,val);
は、次のコードと同じです。
	Tree t = new Tree(:+, new Identifier(:x), val);
また、
	Tree[] sa = { s2, s3, s4,};
	Tree t = `(block ,s0 ,s1 ,@sa ,s5 ,s6);
は、
	Tree t = new Tree(:block, s0, s1, s2, s3, s4, s5, s6);
と同じです。

"," のうしろに続く式の型は Tree 、 ",@" のうしろに続く式の型は Tree[] または TreeVec でなければなりません。

文法上気をつけなければならない重要な点が1つあります。 "," および ",@" の直後が変数名でない場合、すなわち複雑な式が来る場合は、 それをかっこで囲まなければなりません。例えば、

	`(= ,var ,val)
は正しいですが、
	`(= ,getVar() ,getVal())
は、意図された通りに構文解析されません。
	`(= ,(getVar()) ,(getVal()))
のように書く必要があります。

なお、今のバージョンでは、次のような式は、許されません。

	`(,tag ,arg1 ,arg2)
	`(id ,name)
	`(literalTree ,literalTag ,literalContents)
次のような Java の式を使う必要があります。
	new Tree(tag, arg1, arg2)
	new Identifier(name)
	new LiteralTree(literalTag, literalContents)

Java シンタックスを用いたコード埋め込み

将来、S式を使ったコード埋め込みよりも もっと読みやすい形で書けるようにする plug-in を提供する予定です。 例えば、
	Tree t = `(+ (* (id x) (id y)) (literalTree int "1"));
ではなくて、
	Tree t = CODE:E{ x * y + 1 };
のように書けるようにする予定です。
Index