(blog ‘lucindo)

um dia eu aprendo a programar

JavaScript…

Implementação do código do post sobre closures em JavaScript (com umas coisinhas a mais):

function cons(a, b) {
    return function(first) {
        return first ? a : b;
    }
}

function car(c) {
    return c(true);
}

function cdr(c) {
    return c(false);
}

function list() {
    arguments.shift = Array.prototype.shift;
    if (arguments.length == 0) {
        return null;
    } else {
        return cons(arguments.shift(), list.apply(this, arguments));
    }
}

function mapcar(fun, lst) {
    if (null == lst) {
        return null;
    } else {
        return cons(fun(car(lst)), mapcar(fun, cdr(lst)));
    }
}

function reduce(fun, init, lst) {
    if (null == lst) {
        return init;
    } else {
        return fun(car(lst), reduce(fun, init, cdr(lst)));
    }
}

function filter(fun, lst) {
    if (null == lst) {
        return null;
    } else {
        if (fun(car(lst))) {
            return cons(car(lst), filter(fun, cdr(lst)));
        } else {
            return filter(fun, cdr(lst));
        }
    }
}

Um teste tosto:

var lst = list(1, 2, 3, 4);
mapcar(print, lst);
print(reduce(function (a, b) { return a + b; }, 0, lst));
mapcar(print, filter(function (a) { return a % 2; }, lst));

Para rodar, usei o Rhino.



 | Enviar por e-mail  | Hits para esta publicação: 495

Uma resposta para “ JavaScript… ”

  1. […] Mais uns códigos continuando as idéias do post sobre closures, só que em JavaScript (acho que mais gente entende JavaScript do que Ruby). Antes de mais nada: códigos e inspirações do SICP (video-aulas aqui). […]

Deixe uma resposta.