[新しい構文を考える] e4x相当

ゲームにおいてもXMLは当たり前のように使用するようになっています。*1
XtalXMLリテラルとか、XMLノードを簡単に扱える機構を取り入れるべきなのかもしれません。


これは、かなり前、取り入れる方向で考えていました。
しかし、XMLの仕様をちゃんと実装している暇は正直ありません。


とりあえず、文法の部分についてだけ、以前考えていたことを記しておきます。


Xtale4xとまったく同じ構文を導入するのは不可能です。
他の構文と衝突したり、言語機能的にムリがあったりするからです。
*2
それに、いくつかe4xには欠点と思えるところもあります。



e4xでの記法をXtalでもいけるような別の記法を考えてみます。

要素取得

e4xでは

elem.ns::foo

という書き方でelem以下の名前空間nsに属したfoo要素にアクセスできます。
複数のfoo要素があるならば、XMLListを返します。
この書き方は欠点が多いです。

たとえば、要素名には-(ハイフン)と.(ピリオド)を含むことができますが、
e4xの構文では、elem.tag-nameという形式でアクセスすることはできず、
elem["tag-name"]と書く必要があります。
要素の名前によっていちいちアクセスの記法を変える必要があるわけです。
ハイフンなんかはよく使われるので煩わしいでしょう。


また、メソッド呼び出しと区別がつかないのも厄介です。

elem.foo.length

は、foo要素が何個あるのかを取得しているのか、fooの下のlength要素を取得しているのか判断ができません。


これに対しては、次の記法を考えています。

elem.<ns:foo-bar>

これは、elem.op_child(ns, "foo-bar")のシンタックスシュガーとなります。
XMLの記法とほぼ同じで、ハイフンなどを気にする必要はありません。
名前空間を省略するとそこはnullが渡されます。

要素設定

e4xでは

elem.ns::foo = 10;

です。

これは次のように。

elem.<ns:foo> = 10;

elem.op_set_child(ns, "foo", 10)のシンタックスシュガーです。

属性取得

e4xでは

elem.@ns::attr

Xtalでは

elem.<@ns:attr> 

elem.op_attr(ns, "attr")のシンタックスシュガーです。

フィルター

e4xでは

elem.(@id=="10")

Xtalでは

elem.filter(|x| x.<@id>=="10")

普通にメソッド形式ということですね。




これらはXML以外のなんらかのツリー構造のアクセスの際にも役立つのではないかと考えています。
たとえば、フォルダなどですね。

elem. を elem.op_child(ns, "foo-bar")と同じにする、
というシンタックスシュガー自体は、すぐ入れることが簡単にできるので、
とりあえず、記法だけ入れてみようかと思案中です。

*1:言い過ぎた。そういうところもあります

*2:たとえば、with文相当が無いとx.elem.(foo==bar)というのは動かないでしょう。