関数的っポイ!? JavaScript
2006-04-29


普通に書くより長い。というか元のサンプルより長くなった。

"call" が示す関数では JavaScript の関数でなくても呼び出せるように細工してあるので「JavaScriptを関数的っぽくしたらモテるかもな」で示されていた例は以下のように書ける。

var addNewElement =
  "call".bind("get".bind(document, "body"), "appendChild", _1)
        .bind(_1, "set".bind(_1, "innerHTML", "Shibuya.js"))
        .bind("call".bind(document, "createElement", _1));

フィボナッチ数を求める関数もかける。Memoize したら普通に書くよりかなり長めになったが。

// function fib(n)
// {
//   return (n in fib) ? fib[n] :
//          (n <= 1)   ? fib[n] = 1 : fib[n] = fib(n - 1) + fib(n - 2);
// }
window.fib = "invoke".bind(
  "?:".bind(
    "in".bind(_1, "get".bind(window, "fib")),
    "get".bind("get".bind(window, "fib"), _1).literal(),
    "?:".bind(
      "<=".bind(_1, 1),
      "set".bind("get".bind(window, "fib"), _1, 1).literal(),
      "set".bind("get".bind(window, "fib"), _1, "+".bind(
        "call".bind(window, "fib", "-".bind(_1, 1)),
        "call".bind(window, "fib", "-".bind(_1, 2))
      )).literal()
    )
  ), _1
);

とまあいろいろやったが何だかんだ言って beyond.js 及び「関数の合成」の劣化コピーに過ぎないわけで。結局のところ何が言いたいかといえば「beyond.js はすごい!」「『関数の合成』は一読しておくべし」といったところ。


戻る
[JavaScript]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット