素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

Pythonみたいにforを使う

JavaScript1.8+のみ

function xrange(start, end, step) {
  if (typeof end != "number")
    [start, end] = [0, start];
  if (typeof step != "number")
    step = 1;
  if (step > 0 ? end > start : start > end) {
    var sz  = parseInt(Math.abs((end - start) / step));
    for (var i = 0;i < sz;++i){
      yield start;
      start += step;
    }
  }
}

function range(start, end, step)
  list(xrange(start, end, step));

function enumerate(iterable) {
  for (var key in iterable) {
    for each (var value in iterable) {
      yield [key, value];
    }
  }
}

function Generator() {}
Generator.prototype = function () { yield; }().__proto__;
Generator.prototype.toString = function toString() "Generator";

function list(seq)
  seq instanceof Generator ?
    [i for (i in seq)] :
    Array.slice(seq);

function zip() {
  var lists = Array.map(arguments, list);
  var ret = [];
  for (var i in range(lists.map(function (a) a.length).reduce(function (a, b) a > b ? b : a, Infinity))) {
    ret.push(lists.map(function (a) a[i]));
  }
  return ret;
}

Array.prototype.__iterator__ = function __iterator__(key) {
  for (var i = 0;i < this.length;++i)
    yield key ? i : this[i];
}

function fib(n)
  n && range(n - 1).reduce(function ([a, b], _) [b, a + b], [1, 1])[0];


range(10).map(fib); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]