def demo(): from parser import tokenize, parse_exp source = '(* 6 (+ 3 4))' tokens = tokenize(source) expr = parse_exp(tokens) result = evaluate(expr) print(result)
def repl(input_fn=input): """Read-Eval-Print-Loop""" print(f'To exit, type {QUIT_COMMAND}', file=sys.stderr) while True: # ___________________________________________ Read try: line = input_fn('> ') except EOFError: break if line == QUIT_COMMAND: break if not line: continue # ___________________________________________ Eval current_exp = parse_exp(tokenize(line)) if isinstance(current_exp, list) and current_exp[0] == 'define': result = define_function(current_exp[1:]) else: try: result = evaluate({}, current_exp) except (errors.UndefinedVariable, errors.UndefinedFunction) as exc: print('***', exc) continue # ___________________________________________ Print print(result)
def repl(input_fn=input): """Read-Eval-Print-Loop""" print(f'To exit, type {QUIT_COMMAND}', file=sys.stderr) while True: # ___________________________________________ Read try: line = input_fn('> ') except EOFError: break if line == QUIT_COMMAND: break if not line: continue # ___________________________________________ Eval current_exp = parse_exp(tokenize(line)) try: value = evaluate(current_exp) except errors.UndefinedVariable as exc: print('***', exc) continue # ___________________________________________ Print print(value)
def repl(input_fn=input): """Read-Eval-Print-Loop""" print(f'To exit, type {QUIT_COMMAND}', file=sys.stderr) while True: # ___________________________________________ Read try: source = multiline_input('> ', '... ', quit_cmd=QUIT_COMMAND, input_fn=input_fn) except (EOFError, QuitRequest): break except errors.UnexpectedCloseParen as exc: print('***', exc) continue if not source: continue # ___________________________________________ Eval current_exp = parse_exp(tokenize(source)) if isinstance(current_exp, list) and current_exp[0] == 'define': result = define_function(current_exp[1:]) else: try: result = evaluate({}, current_exp) except errors.EvaluatorException as exc: print('***', exc) continue # ___________________________________________ Print print(result)
def run(source_file, env=None): """Read and execute opened source file""" source = source_file.read() if env is None: env = {} tokens = tokenize(source) while tokens: try: current_exp = parse_exp(tokens) except errors.UnexpectedCloseParen as exc: print('***', exc, file=sys.stderr) break if isinstance(current_exp, list) and current_exp[0] == 'define': define_function(current_exp[1:]) else: try: evaluate(env, current_exp) except errors.EvaluatorException as exc: print('***', exc, file=sys.stderr) continue
def test_parse_unexpected_end_of_source(): tokens = tokenize('(') with raises(errors.UnexpectedEndOfSource) as excinfo: parse_exp(tokens) assert "Unexpected end of source code." == str(excinfo.value)
def test_parse_unexpected_close_parenthesis(): tokens = tokenize(')') with raises(errors.UnexpectedCloseParen) as excinfo: parse_exp(tokens) assert "Unexpected close parenthesis." == str(excinfo.value)
def test_parse_exp_application(source, ast): got = parse_exp(tokenize(source)) assert ast == got
def test_parse_exp_atoms(source, ast): got = parse_exp(tokenize(source)) assert ast == got