def cond(args, env): l = list(args) for i, s in enumerate(l): if s.car == Symbol('else') or scheme_eval(s.car, env) != Symbol('#f'): if s.car == Symbol('else') and i != len(l) - 1: raise SyntaxError('Misplaced ELSE clause') return scheme_eval(Cell(Symbol('begin'), s.cdr), env)
def let_star(args, env): if args.car.null: return scheme_eval(Cell(Symbol('begin'), args.cdr), env) else: return let_star(Cell(args.car.cdr, args.cdr), Environment(env, {args.car.car.car: scheme_eval(args.car.car.cdr.car, env)}))
def let(args, env): var_list = args.car body = args.cdr argnames = cons_list(i.car for i in var_list) arg_values = cons_list(scheme_eval(i.cdr.car, env) for i in var_list) l = create_lambda(Cell(argnames, body), env) return l(arg_values)
def define(args, env): if type(args.car) is Symbol: env.define(args.car, scheme_eval(args.cdr.car, env)) elif type(args.car) is Cell: name = args.car.car arguments = args.car.cdr body = args.cdr if arguments.car == Symbol('.'): arguments = arguments.cdr.car env.define(name, create_lambda(Cell(arguments, body), env))
def repl(): code = '' while True: code += input() try: parsed = parse(code) except SyntaxError as e: code += '\n' continue else: result = scheme_eval(parsed, global_env) print(result if result is not None else 'Unspecified value') code = ''
def file_eval(filename): with open(filename, 'r') as program_file: code = program_file.read() code = '(begin ' + code + ')' parsed = parse(code) scheme_eval(parsed, global_env)
def scheme_apply(args, env): return scheme_eval(Cell(args.car, scheme_eval(args.cdr.car, env)), env)
def scheme_or(args, env): for i in iter(args): result = scheme_eval(i, env) if result != scheme_false: return result return scheme_false