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のような、任意個の引数をとる定義がやりやすいのも手伝っている。
JavaScriptはSchemeに近いので、このallメソッドの定義も、all Iterator array1 array2 ... のほうがいいかも。