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に続く