コード例 #1
0
ファイル: jcli_evaluator.py プロジェクト: Joshua-Chin/jcli
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))
コード例 #2
0
ファイル: jcli_evaluator.py プロジェクト: Joshua-Chin/jcli
 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
コード例 #3
0
ファイル: jcli_evaluator.py プロジェクト: Joshua-Chin/jcli
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)