def eval(string, bindings=None, builtins=None): if builtins is None: builtins = jcli_globals if bindings is None: bindings = closure(builtins) else: bindings = {sym(k): bindings[k] for k in bindings.keys()} bindings.update(builtins) asts = jcli_parser.parse(string) return list(map(lambda ast: eval_ast(ast, bindings), asts))
def function(*args): c = closure(env) if len(arg_names) != len(args): raise TypeError( 'function expected %s arguments, got %s' %(len(arg_names), len(args))) for arg_name, arg in zip(arg_names, args): c[arg_name.value] = arg out = hack((body.value, c)) return out
from jcli_datatypes import linked_list, sym, quote, closure, car, cdr, cons, null import jcli_tokenizer import jcli_parser import operator jcli_globals = { sym('eval'): lambda x: ( eval_ast(x.value, closure(jcli_globals)) if isinstance(x, quote) else x), sym('+'): operator.add, sym('-'): operator.sub, sym('*'): operator.mul, # sym('/'): operator.div, sym('='): operator.eq, sym('or'): lambda x,y: x or y, sym('and'): lambda x,y: x and y, sym('not'): lambda x: not x, sym('cons'): lambda x,y: cons(x, y.value), sym('car'): lambda x: car(x.value), sym('cdr'): lambda x: cdr(x.value),} def eval(string, bindings=None, builtins=None): if builtins is None: builtins = jcli_globals if bindings is None: bindings = closure(builtins) else: bindings = {sym(k): bindings[k] for k in bindings.keys()} bindings.update(builtins)