latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

Ruby のブロックスコープ風の構文を JavaScript に取り入れるとすると…

(ε・◇・)з o O ( Rubyブロックスコープ的なコードですかー

console.log([1,2,3].map2('{|i| "<li>" + i + "</li>" }').join(""));
console.log([1,2,3].map2('{|i| var rv = "<li>" + i + "</li>"; rv }').join(""));
console.log([1,2,3].map2('{|i| return "<li>" + i + "</li>" }').join(""));
<li>1</li><li>2</li><li>3</li>
Array.prototype.map2 = function(expr,   // @arg Function/RubyBlockExpression:
                                that) { // @arg Mix: callback.call(that)
                                        // @ret Array:
    function _block(expr) {
        var m = /^\{\s*\|\s*([^\|]+)\s*\|\s*(.*)\}$/.exec(expr.trim()),
            args, code, lines, last;

        if (m) {
            args = m[1].trim();
            code = m[2].trim();
            if (/return/.test(expr)) {
                return new Function(args, code);
            }
            lines = code.split(/;(?:[\r\n]|\s+)/);
            last = lines.length - 1;
            lines[last] = "return " + lines[last];

            return new Function(args, lines.join(";"));
        }
        return null;
    }

    if (typeof expr === "string") {
        expr = _block(expr);
    }
    return this.map(expr, that || null);
};


(ε・◇・)з o O ( 5分で書くと、こんな感じ?
(ε・◇・)з o O ( new Function 使ってるので周囲の環境もちこせずー クロージャとしては使えませんね