JavaScriptでキモいコードを見た

気持ちはわからんでもない。

//f( x, a0, a1, ... , aN)の関数を作る。
function f() {
  var a_all = $A(arguments), x = a_all.shift();
}

shiftメソッドの副作用に期待している。うげー。
car、cdrを用意したほうがいいと思う。

パターンマッチングならなお可。

もう1個、これはzipとallを組み合わせるコードだけど、パターンマッチングがないと、つらい。

a1.zip(a2).all(function(pair, index) {
  var a1_elt = pair.first(), a2_elt = pair.last();
}

この例は、そう悲観することもない。Javascript 1.7 の分割代入でこうなるから。

a1.zip(a2).all(function(pair, index) {
  var [a1_elt, a2_elt] = pair;
}

それでも、最初の例は分割代入じゃだめで、パターンマッチングが必要なんでは?

分割代入 << 越えられない壁 << パターンマッチング

      • -

そういう目でSchemeを見ると、Schemeでこのallメソッドにあたる、SRFI-1のevery関数は、every pred clist1 clist2 …
となっていて、pred に lambda(a1_elt,a2_elt) と書くから、パターンマッチングがなくてもやっていけたんだな。
動的型付けの言語だから、everyのような、任意個の引数をとる定義がやりやすいのも手伝っている。

JavaScriptSchemeに近いので、このallメソッドの定義も、all Iterator array1 array2 ... のほうがいいかも。