array comprehension

おれのテンションをダダ上がりさせた jscompletion.js ( http://vimperator.org/trac/ticket/20 ) を読んでいていろいろ勉強になったのでまとめそのいち。てかかなりいろいろ見たり聞いたりしたのでひとつにまとまらない。ダラダラ続けるかも。

まず配列内包表記 array comprehension 。 JavaScript 1.7 から使えるようになったらしい ( https://developer.mozilla.org/ja/New_in_JavaScript_1.7#.E9.85.8D.E5.88.97.E5.86.85.E5.8C.85 ) 。 PythonHaskell で使われてたリスト内包表記 ( http://www.python.jp/doc/release/tut/node7.html ) をパクってきたらしい。で、 ECMAScript 4 で採択されたらしい ( page 33 on http://www.ecmascript.org/es4/spec/overview.pdf ) 。ので今から理解しておいて損はないかも。ただ、まだほかのブラウザではまだ使えないのかもしれない ( ちょろめとちょろみうむではダメだった ) 。

余談だけどおれの知り合いのその筋のひとによると、リスト内包表記も配列内包表記も厳密な内包表記じゃないということらしいんだけど、そこに突っ込むと現実的には実装できなくなるみたいなのであまり深く考えちゃいけないみたい ( http://ja.wikipedia.org/wiki/%E5%AE%9A%E7%BE%A9#.E5.A4.96.E5.BB.B6.E3.81.A8.E5.86.85.E5.8C.85 ) 。配列表記の例でいうと動くのが

// [3, 4]
[i for each (i in [0, 1, 2, 3, 4, 5]) if (i > 2 && i < 5)]

ってな感じなんだけど [0, 1, 2, 3, 4, 5] っていう風に最初に範囲を明示してやらなきゃいけないので ( 関数で生成したりオブジェクトの中身を見たりしても結局展開されて範囲が決まるよね ) それ外延表記含んでね ? ってことらしい。本当の内包表記は

// [3, 4]?
[i for each (i in Integer) if (i > 2 && i < 5)]

だよねとかそういうハナシ。