def eval_ast(ast, env): if is_vector(ast): return make_vector(EVAL(elem, env) for elem in ast) if is_hashmap(ast): return make_hashmap_from_pydict( {key: EVAL(value, env) for key, value in items(ast)} ) if is_symbol(ast): return env.get(ast) elif is_list(ast): return make_list(EVAL(elem, env) for elem in ast) else: return ast
def py_eval(expression): result = eval(expression) if isinstance(result, (tuple, list)): return make_list(result) elif isinstance(result, str): return result elif isinstance(result, bool): return result elif isinstance(result, dict): return make_hashmap_from_pydict(result) elif isinstance(result, (int, float)): return make_number(result) elif result is None: return NIL raise TypeError(f'Can\'t convert python type {type(result)} to mal type')