E4X と autovivification

nanto_vi, 2013-05-19

自己紹介

XML オブジェクトのプロパティへの代入

var a = <a/>;
a.b = 'foo';
// <a>
//   <b>foo</b>
// </a>

入れ子になった要素を一度に作成する

var a = <a/>;
a.b.c.d.e = 'foo';
// <a>
//   <b>
//     <c>
//       <d>
//         <e>foo</e>
//       </d>
//     </c>
//   </b>
// </a>

XMLList[[ResolveValue]]

var a = <a/>;
var list = a.b;

[[ResolveValue]] 内部メソッドは、

中間のデータ構造も一気に作るといえば

Perl

my $a;
$a->{b}->[0]->{c} = "foo";
say Dumper $a;
# $VAR1 = {
#     'b' => [
#         {
#             'c' => 'foo'
#         }
#     ]
# };

autovivification!

vivify
【他動】 活気づける、生き生きさせる
vivification
【名】 生命を与えること、蘇生、復活

英辞郎

応用: prefs の取得・設定

var data = { 'foo.bar.baz': 42 };
var Prefs = <prefs/>;

XML.prototype.function::get = function () {
    this._ = '';
    var branches = [];
    for (var branch = this;
         branch !== Prefs;
         branch = branch.parent()) {
        branches.push(branch.name());
    }
    var key = branches.reverse().join('.');
    return data[key];
};

XML.prototype.function::set = function (value) {
    this._ = '';
    var branches = [];
    for (var branch = this;
         branch !== Prefs;
         branch = branch.parent()) {
        branches.push(branch.name());
    }
    var key = branches.reverse().join('.');
    data[key] = value;
};

Prefs.foo.bar.baz.get(); // => 42
Prefs.foo.bar.baz.qux.set('Hello, E4X world!');
// data => {
//    'foo.bar.baz':     42,
//    'foo.bar.baz.qux': 'Hello, E4X world!',
// }

まとめ