eval (expr, env) // expr - , env - if typeof(expr) = Atom // - return lookup(expr, env) // elseif typeof(expr) = List // - evalexpr = mapeval(expr, env) // // eval // return apply(evalexpr, env) // else return expr // apply (expr, env) // expr - , env - op = head(expr) // - args = tail(expr) // - case op of .................. // .................. // .................. // .................. // ... // Function f: // - newenv = subenv(args, f.clojure) // - return eval(f.body, newenv) // //
/** Liscript - */ public static class Func { /** */ public ConsList pars; /** */ public Object body; /** , */ public Env clojure; /** * @param p * @param b * @param c , */ Func(ConsList p, Object b, Env c) { pars = p; body = b; clojure = c; } /** @return */ @Override public String toString() { return showVal(this); } } private static class FuncCall { public Func f; public HashMap<String, Object> args; FuncCall(Func _f, HashMap<String, Object> _a) { f = _f; args = _a; } @Override public String toString() { return "FUNCALL: " + args.toString(); } }
/** * - : - , * . . */ public class Env { /** - */ public HashMap<String, Object> map; /** */ public Env parent; /** . * @param m - * @param p */ Env (HashMap<String, Object> m, Env p) { map = m; parent = p; } /** . * . */ Env () { this(new HashMap<String, Object>(), null); } /** , * . * @param var - * @param value - */ public void setVar(String var, Object value) { Env env = this; while (env != null) { if (env.map.containsKey(var)) {env.map.put(var, value); break;} env = env.parent; } } /** , * . - * . * @param var - * @return - */ public Object getVar(String var) { Env env = this; while (env != null) { if (env.map.containsKey(var)) return env.map.get(var); env = env.parent; } return var; } /** * @param var - * @param value - */ public void defVar(String var, Object value) { this.map.put(var, value); } /** , * . * @param var - * @return / */ public boolean isBounded(String var) { Env env = this; while (env != null) { if (env.map.containsKey(var)) return true; env = env.parent; } return false; } }
else if (op instanceof Func) { Func f = (Func)op; // FuncCall FuncCall fcall = new FuncCall(f, getMapArgsVals(d, io, env, f.pars, ls, true)); if (strict) { v = fcall; while (v instanceof FuncCall) { FuncCall fc = (FuncCall) v; v = eval(d, false, io, new Env(fc.args, fc.f.clojure), fc.f.body); } return v; } else return fcall;
def a (list-from-to 1 100) => OK def b (list-from-to 1 100000) => OK defn foldl (fal) (cond (null? l) a (foldl f (f (car l) a) (cdr l)) ) => OK defn foldr (fal) (cond (null? l) a (f (car l) (foldr fa (cdr l))) ) => OK foldl + 0 a => 5050 foldr + 0 a => 5050 foldl + 0.0 b => 5.00005E9 foldr + 0.0 b => java.lang.StackOverflowError
defn f (na) (cond (< n 2) a (f (- n 1) (* na))) => OK tray (f 5 1) => 1 β (f 5 1) 2 β f 2 β (lambda (na) (cond (< n 2) a (f (- n 1) (* na)))) 2 β (cond (< n 2) a (f (- n 1) (* na))) 3 β (< n 2) 4 β n 4 β 5 3 β false 3 β (f (- n 1) (* na)) 4 β f 4 β (lambda (na) (cond (< n 2) a (f (- n 1) (* na)))) 4 β (- n 1) 5 β n 5 β 5 4 β 4 4 β (* na) 5 β n 5 β 5 5 β a 5 β 1 4 β 5 4 β (cond (< n 2) a (f (- n 1) (* na))) 5 β (< n 2) 6 β n 6 β 4 5 β false 5 β (f (- n 1) (* na)) 6 β f 6 β (lambda (na) (cond (< n 2) a (f (- n 1) (* na)))) 6 β (- n 1) 7 β n 7 β 4 6 β 3 6 β (* na) 7 β n 7 β 4 7 β a 7 β 5 6 β 20 6 β (cond (< n 2) a (f (- n 1) (* na))) 7 β (< n 2) 8 β n 8 β 3 7 β false 7 β (f (- n 1) (* na)) 8 β f 8 β (lambda (na) (cond (< n 2) a (f (- n 1) (* na)))) 8 β (- n 1) 9 β n 9 β 3 8 β 2 8 β (* na) 9 β n 9 β 3 9 β a 9 β 20 8 β 60 8 β (cond (< n 2) a (f (- n 1) (* na))) 9 β (< n 2) 10 β n 10 β 2 9 β false 9 β (f (- n 1) (* na)) 10 β f 10 β (lambda (na) (cond (< n 2) a (f (- n 1) (* na)))) 10 β (- n 1) 11 β n 11 β 2 10 β 1 10 β (* na) 11 β n 11 β 2 11 β a 11 β 60 10 β 120 10 β (cond (< n 2) a (f (- n 1) (* na))) 11 β (< n 2) 12 β n 12 β 1 11 β true 11 β a 11 β 120 10 β 120 9 β 120 8 β 120 7 β 120 6 β 120 5 β 120 4 β 120 3 β 120 2 β 120 1 β 120 120
defn is-even (n) (cond (= n 0) true (is-odd (- n 1)) ) => OK defn is-odd (n) (cond (= n 0) false (is-even (- n 1)) ) => OK tray (is-even 5) => 1 β (is-even 5) 2 β is-even 2 β (lambda (n) (cond (= n 0) true (is-odd (- n 1)))) 2 β (cond (= n 0) true (is-odd (- n 1))) 3 β (= n 0) 4 β n 4 β 5 3 β false 3 β (is-odd (- n 1)) 4 β is-odd 4 β (lambda (n) (cond (= n 0) false (is-even (- n 1)))) 4 β (- n 1) 5 β n 5 β 5 4 β 4 4 β (cond (= n 0) false (is-even (- n 1))) 5 β (= n 0) 6 β n 6 β 4 5 β false 5 β (is-even (- n 1)) 6 β is-even 6 β (lambda (n) (cond (= n 0) true (is-odd (- n 1)))) 6 β (- n 1) 7 β n 7 β 4 6 β 3 6 β (cond (= n 0) true (is-odd (- n 1))) 7 β (= n 0) 8 β n 8 β 3 7 β false 7 β (is-odd (- n 1)) 8 β is-odd 8 β (lambda (n) (cond (= n 0) false (is-even (- n 1)))) 8 β (- n 1) 9 β n 9 β 3 8 β 2 8 β (cond (= n 0) false (is-even (- n 1))) 9 β (= n 0) 10 β n 10 β 2 9 β false 9 β (is-even (- n 1)) 10 β is-even 10 β (lambda (n) (cond (= n 0) true (is-odd (- n 1)))) 10 β (- n 1) 11 β n 11 β 2 10 β 1 10 β (cond (= n 0) true (is-odd (- n 1))) 11 β (= n 0) 12 β n 12 β 1 11 β false 11 β (is-odd (- n 1)) 12 β is-odd 12 β (lambda (n) (cond (= n 0) false (is-even (- n 1)))) 12 β (- n 1) 13 β n 13 β 1 12 β 0 12 β (cond (= n 0) false (is-even (- n 1))) 13 β (= n 0) 14 β n 14 β 0 13 β true 12 β false 11 β false 10 β false 9 β false 8 β false 7 β false 6 β false 5 β false 4 β false 3 β false 2 β false 1 β false false
defn f (na) (cond (< n 2) a (f (- n 1) (* na))) => OK tray (f 5 1) => 1 β (f 5 1) 2 β f 2 β (lambda (na) (cond (< n 2) a (f (- n 1) (* na)))) 2 β (cond (< n 2) a (f (- n 1) (* na))) 3 β (< n 2) 4 β n 4 β 5 3 β false 3 β (f (- n 1) (* na)) 4 β f 4 β (lambda (na) (cond (< n 2) a (f (- n 1) (* na)))) 4 β (- n 1) 5 β n 5 β 5 4 β 4 4 β (* na) 5 β n 5 β 5 5 β a 5 β 1 4 β 5 3 β FUNCALL: {a=5, n=4} 2 β FUNCALL: {a=5, n=4} 2 β (cond (< n 2) a (f (- n 1) (* na))) 3 β (< n 2) 4 β n 4 β 4 3 β false 3 β (f (- n 1) (* na)) 4 β f 4 β (lambda (na) (cond (< n 2) a (f (- n 1) (* na)))) 4 β (- n 1) 5 β n 5 β 4 4 β 3 4 β (* na) 5 β n 5 β 4 5 β a 5 β 5 4 β 20 3 β FUNCALL: {a=20, n=3} 2 β FUNCALL: {a=20, n=3} 2 β (cond (< n 2) a (f (- n 1) (* na))) 3 β (< n 2) 4 β n 4 β 3 3 β false 3 β (f (- n 1) (* na)) 4 β f 4 β (lambda (na) (cond (< n 2) a (f (- n 1) (* na)))) 4 β (- n 1) 5 β n 5 β 3 4 β 2 4 β (* na) 5 β n 5 β 3 5 β a 5 β 20 4 β 60 3 β FUNCALL: {a=60, n=2} 2 β FUNCALL: {a=60, n=2} 2 β (cond (< n 2) a (f (- n 1) (* na))) 3 β (< n 2) 4 β n 4 β 2 3 β false 3 β (f (- n 1) (* na)) 4 β f 4 β (lambda (na) (cond (< n 2) a (f (- n 1) (* na)))) 4 β (- n 1) 5 β n 5 β 2 4 β 1 4 β (* na) 5 β n 5 β 2 5 β a 5 β 60 4 β 120 3 β FUNCALL: {a=120, n=1} 2 β FUNCALL: {a=120, n=1} 2 β (cond (< n 2) a (f (- n 1) (* na))) 3 β (< n 2) 4 β n 4 β 1 3 β true 3 β a 3 β 120 2 β 120 1 β 120 120
defn is-even (n) (cond (= n 0) true (is-odd (- n 1)) ) => OK defn is-odd (n) (cond (= n 0) false (is-even (- n 1)) ) => OK tray (is-even 5) => 1 β (is-even 5) 2 β is-even 2 β (lambda (n) (cond (= n 0) true (is-odd (- n 1)))) 2 β (cond (= n 0) true (is-odd (- n 1))) 3 β (= n 0) 4 β n 4 β 5 3 β false 3 β (is-odd (- n 1)) 4 β is-odd 4 β (lambda (n) (cond (= n 0) false (is-even (- n 1)))) 4 β (- n 1) 5 β n 5 β 5 4 β 4 3 β FUNCALL: {n=4} 2 β FUNCALL: {n=4} 2 β (cond (= n 0) false (is-even (- n 1))) 3 β (= n 0) 4 β n 4 β 4 3 β false 3 β (is-even (- n 1)) 4 β is-even 4 β (lambda (n) (cond (= n 0) true (is-odd (- n 1)))) 4 β (- n 1) 5 β n 5 β 4 4 β 3 3 β FUNCALL: {n=3} 2 β FUNCALL: {n=3} 2 β (cond (= n 0) true (is-odd (- n 1))) 3 β (= n 0) 4 β n 4 β 3 3 β false 3 β (is-odd (- n 1)) 4 β is-odd 4 β (lambda (n) (cond (= n 0) false (is-even (- n 1)))) 4 β (- n 1) 5 β n 5 β 3 4 β 2 3 β FUNCALL: {n=2} 2 β FUNCALL: {n=2} 2 β (cond (= n 0) false (is-even (- n 1))) 3 β (= n 0) 4 β n 4 β 2 3 β false 3 β (is-even (- n 1)) 4 β is-even 4 β (lambda (n) (cond (= n 0) true (is-odd (- n 1)))) 4 β (- n 1) 5 β n 5 β 2 4 β 1 3 β FUNCALL: {n=1} 2 β FUNCALL: {n=1} 2 β (cond (= n 0) true (is-odd (- n 1))) 3 β (= n 0) 4 β n 4 β 1 3 β false 3 β (is-odd (- n 1)) 4 β is-odd 4 β (lambda (n) (cond (= n 0) false (is-even (- n 1)))) 4 β (- n 1) 5 β n 5 β 1 4 β 0 3 β FUNCALL: {n=0} 2 β FUNCALL: {n=0} 2 β (cond (= n 0) false (is-even (- n 1))) 3 β (= n 0) 4 β n 4 β 0 3 β true 2 β false 1 β false false
Source: https://habr.com/ru/post/282093/
All Articles