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)
Tree t = `(+ (* (id x) (id y)) (literalTree int "1"));ではなくて、
Tree t = CODE:E{ x * y + 1 };のように書けるようにする予定です。