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