2008年06月12日
E4X の変数展開 深追い (1)
E4X の変数展開が E4Xで変数展開、テンプレート - 素人がプログラミングを勉強するブログ で取り上げられていた。
var foo=123;
<>変数fooは{foo}です。</>.toString();
// "変数fooは123です。"
ほー。
仕様書では
E4XのリテラルXMLでの式評価 - 0x廃棄階層 - 統治局 によると、仕様書には次のようなコードがあるらしい。
var tagname = "name";
var attributename = "id";
var attributevalue = 5;
var content = "Fred";
var x = <{tagname} {attributename}={attributevalue}>{content}</{tagname}>;
// <name id="5">Fred</name>
タグ名にも属性名にも属性の値にもタグの中身にも使える模様。
仕様書によると、例えばタグ名は次のように解釈される。
XMLTagName :
{ Expression }
XMLName
{} で囲まれた部分は Expression(式)として評価される。文はダメ。
試してみた
リテラル XML が評価されるときに中の式の評価も行われる。だから、コンパイル時に値が定まってなくてもOK。
function xml1(str){
return <test>{str}</test>;
}
xml1("Hello").toXMLString();
// <test>Hello</test>
ってことは、演算とか関数呼び出しもOK。
function xml2(str){
return <test>{str + "," + str}</test>;
}
xml2("Hello").toXMLString();
// <test>Hello,Hello</test>
もいっちょ。
function xml3(str){
return <test>{str.substr(2)}</test>;
}
xml3("Hello").toXMLString();
// <test>llo</test>
ってことは、無名関数実行してもいいよね。
function xml5(str){
return <test>{(function(a){return a + a})(str)}</test>;
}
xml5("Hello").toXMLString();
// <test>HelloHello</test>
いけた。式であれば {} の中に function も入れれる。
ただ、XML リテラルのときしか展開されない。new XML() の中に入れてもダメ。
var a = 3;
new XML("<hoge>{a}</hoge>").toXMLString()
// <hoge>{a}</hoge>
まとめ
ちょっと楽に書けそう。
→その2に続く。