Portál AbcLinuxu, 15. května 2025 05:12

Dotaz: Zjednodusenie lisp-like interpretra v JS

30.11.2016 15:48 gsnak | skóre: 22 | blog: gsnak
Zjednodusenie lisp-like interpretra v JS
Přečteno: 287×
Odpovědět | Admin
Mam nasledovny lisp-like interpreter v JS:
var fun = {
    "+": function (a) { return a.reduce(function (a, b) { return a + b; }); },
    "-": function (a) { return a.reduce(function (a, b) { return a - b; }); },
    "*": function (a) { return a.reduce(function (a, b) { return a * b; }); },
    "/": function (a) { return a.reduce(function (a, b) { return a / b; }); }
};

function lisp(aCode) {
    var i, fn, arg;
    if (Array.isArray(aCode)) {
        fn = aCode[0];
        arg = aCode.slice(1);
        for (i = 0; i < arg.length; i++) {
            if (Array.isArray(arg[i])) {
                arg[i] = lisp(arg[i]);
            }
        }
        return fun[fn](arg);
    }
    return aCode;
}

console.log(lisp(["/", 22, ["-", 10, ["+", 1, 1, 1]]]));
console.log(22 / (10 - (1 + 1 + 1)));
Ale ta hlavna funkcia lisp() sa mi zda neelegantna, nevedeli by ste niekto napisat ju elegantnejsie? Myslim ze to ide zapisat este kratsie.
Čo Rys, to vrah!

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

wamba avatar 30.11.2016 19:27 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Zjednodusenie lisp-like interpretra v JS
Odpovědět | | Sbalit | Link | Blokovat | Admin
Podle mě je tam podruhý ten if zbytečně. A možná bych raději testoval, kdy to není Array, abych měl zanořený jen ten return aCode a ne celý ten blok.
This would have been so hard to fix when you don't know that there is in fact an easy fix.
1.12.2016 09:09 gsnak | skóre: 22 | blog: gsnak
Rozbalit Rozbalit vše Re: Zjednodusenie lisp-like interpretra v JS
Jo, mas pravdu, ten druhy if tam bol zbytocne.
Čo Rys, to vrah!
1.12.2016 09:12 gsnak | skóre: 22 | blog: gsnak
Rozbalit Rozbalit vše Re: Zjednodusenie lisp-like interpretra v JS
Aj to znizenie odsadenia pomohlo:
function lisp(aCode) {
    var i, fn, arg;
    if (!Array.isArray(aCode)) {
       return aCode;
    }
    fn = aCode[0];
    arg = aCode.slice(1);
    for (i = 0; i < arg.length; i++) {
        arg[i] = lisp(arg[i]);
    }
    return fun[fn](arg);
}
Čo Rys, to vrah!

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.