Scala のXMLリテラル

ScalaにはXMLリテラルとして書く機能がある.文字列としてではなく,XMLのオブジェクトとして直接解釈される.具体的には scala.xml.Elem という型になるようだ.しかも,Scalaの式を'{','}'で囲んで埋め込むことができる.
下記はReferenceからの引用.

val b = 
  <book> 
    <title>The Scala Language Specification</title> 
    <version>{scalaBook.version}</version> 
    <authors>{scalaBook.authors.mkList("", ", ", "")}</authors> 
  </book>

なんらかのクォートで囲むでも無く,いきなり書くことができる.

おかしな(?)挙動

パーザは,XMLの開始っぽい部分を発見するとXMLモードに入る.なのでこんな変なことが起こる.

変数aを2にセット,1と比較.成功する.

scala> var a = 2   
a: Int = 2

scala> var x = 1 < a
x: Boolean = true

'<'と'a'との間のスペースを省略するとXML '<a'がXMLの開始と判断されてパーズエラー(!).

scala> var x = 1 <a
<console>:1: error: ';' expected but $XMLSTART$< found.
       var x = 1 <a
                 ^

逆の比較の場合には,スペースの省略が可能.

scala> var x = 1 >a 
x: Boolean = false

所感

うーん,まいったなあ.こういういかにも不整合な部分がある言語は好きじゃない.Scala好きになりたいのにな.XMLのパーザに入る為の明示的なスイッチを追加するだけでよさそうなのに,なんでこういう無理をするかな.