OMeta-JS

しばらく仕事に関係ないことばかりかいていましたが、仕事(笑)はしています。FRPの実験も粛々とすすめ、Lively Kernel上で例題もいくつか動いています。

VPRIにはインターンが数人いますが(さらにいつでも募集中です!)、そのうちの一人Long NguyenがOMeta-JSを使っていて、かなり基本的なバグを見つけていました。

リストマッチの機能を使って、以下のようなルールを書きます。意図としては、規則aは、「"x"という文字列だけを要素とするリストだけを要素とするリストにだけマッチする」というものです。

ometa AAA {
   a = [ [ "x" ] ]
}

が、規則aはその他いろいろなものにマッチします。単なる文字列"x"にも、文字列"x"のみからなるリストにもマッチします。

AAA.match("x", "a")
AAA.match(["x"], "a")

これは文字列をリストと同一視し、リストマッチのときにちゃんとチェックしていないということが原因ですが(Squeak版にはこの問題はないです)、なんだか足の下の地面がぽっかりと割れたような気分です。今まで使っていたときはヘッドのみで他の要素のないリストは滅多に使っていなかったので回避できていたのでしょうが。

(追記)
この問題は"x"のところが長さ1の時にのみ起こるのだった。謎過ぎる。