def define_func(args, env): if isinstance(first(args), LispSymbol): # we have the first form args = to_list(args) assert args[-1] is nil assert len(args) == 3 var = args[0] value = args[1] elif isinstance(first(args), LispPair): # we have the second form var = first(first(args)) param = rest(first(args)) body = rest(args) assert isinstance(var, (LispSymbol, LispPair)) value = from_list([mksym("lambda"), param, body]) else: raise Exception("invalid form") assert isinstance(var, LispSymbol) result = value.scm_eval(env) # todo set the datatype env.define(var.name, None, result) return nil
def class_func(args, env): # turn to a list and remove the trailing nil parents = to_list(args)[:-1] # lookup the parents evaled_parents = [parent.scm_eval(env) for parent in parents] return LispClass(evaled_parents)
def begin_func(args, env): args = to_list(args) assert args[-1] is nil, "invalid args for 'begin': %s" % args assert len(args) >= 2, "invalid args for 'begin': %s" % args for arg in args[:-1]: result = arg.scm_eval(env) return result
def func(args, env): evaled_args = [arg.scm_eval(env) for arg in to_list(args)][:-1] assert len(evaled_args) == 2 assert isinstance(evaled_args[0], LispInteger) assert isinstance(evaled_args[1], LispInteger) result = inputfunction(evaled_args[0].num, evaled_args[1].num) if isinstance(result, int): result = LispInteger(result) return result
def class_chmod_func(args, env): class_name = first(args) var_name = first(rest(args)) flags = to_list(rest(rest(args)))[:-1] evaled_class = class_name.scm_eval(env) evaled_var = var_name.scm_eval(env).name evaled_flags = [flag.scm_eval(env).name for flag in flags] evaled_class.chmod(evaled_var, evaled_flags) return nil
def set_func(args, env): args = to_list(args) assert args[-1] is nil assert len(args) == 3 var = args[0] arg = args[1] assert isinstance(var, LispSymbol) evaled_arg = arg.scm_eval(env) env.set(var.name, evaled_arg) return nil
def if_func(args, env): args = to_list(args) assert args[-1] is nil assert 3 <= len(args) <= 4 predicate = args[0] consequence = args[1] alternative = args[2] result = predicate.scm_eval(env) if result is true: return consequence.scm_eval(env) else: return alternative.scm_eval(env)
def func(args, env): evaled_args = [arg.scm_eval(env) for arg in to_list(args)][:-1] result = inputfunction(*evaled_args) if result is None: result = nil return result
def quote_func(args, env): args = to_list(args) assert args[-1] is nil assert len(args) == 2 return args[0]