def test_or_shortcircuit(): source = ['(or #t never-reached)'] exp = parse_tokens(tokenize(source))[0] try: eval_in_env(exp, Environment([])) except Exception as e: assert str(e) != 'unknown variable "never-reached"'
def repl(): color_print('****************************************', 'blue') color_print('lis.py - a simple Lisp written in Python', 'blue') color_print('(c) Nick Collins, 2013', 'blue') color_print('****************************************', 'blue') env = Environment([]) while True: try: user_input = raw_input('lis.py> ') exp = parse_tokens(tokenize([user_input]))[0] tmp_env = Environment([], env) color_print(eval_in_env(exp, tmp_env), 'green') env = tmp_env except EOFError: color_print('\nLeaving lis.py.', 'blue') break except LisNameError as e: color_print(e, 'red') except LisSyntaxError as e: color_print(e, 'red') except Exception as e: color_print(e, 'red') print('*** Invalid input ***')
def test_add(): source = ['(+ 1 3 5)'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, Environment([])) == 9
def test_and_false(): source = ['(and (> 2 1) (= 1 2) #t)'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, Environment([])) == False
def test_divide(): source = ['(/ 10 3)'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, Environment([])) == 3
def test_gt(): source0, source1 = ['(> 2 2)'], ['(> 3 2)'] exp0 = parse_tokens(tokenize(source0))[0] exp1 = parse_tokens(tokenize(source1))[0] assert eval_in_env(exp0, Environment([])) == False assert eval_in_env(exp1, Environment([])) == True
def test_multiply(): source = ['(* 1 3 5)'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, Environment([])) == 15
def test_subtract(): source = ['(- 10 14)'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, Environment([])) == -4
env = tmp_env except EOFError: color_print('\nLeaving lis.py.', 'blue') break except LisNameError as e: color_print(e, 'red') except LisSyntaxError as e: color_print(e, 'red') except Exception as e: color_print(e, 'red') print('*** Invalid input ***') # RUN INTERPRETER ====================== if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('source', nargs = '?', default=None, help='source file') args = parser.parse_args() if args.source: try: with open(args.source, 'r') as source: tokens = tokenize(source) program = parse_tokens(tokens) eval_loop(program) except IOError as e: color_print(e, 'red') color_print('Invalid source file', 'red') else: repl()
def test_parse_unexpected_closing_paren(): source = ['(define add 3))'] tokens = tokenize(source) with pytest.raises(LisSyntaxError) as e: exp = parse_tokens(tokens)
def test_nullcheck(): source = ['(null? null)'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, []) == True
def test_nullcheck_2(): source = ['(null? (cons 1 null))'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, []) == False
def test_list(): source = ['(list 1 2 (+ 1 2) 4)'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, []) == [1, 2, 3, 4]
def test_cdr(): source = ['(cdr (cons 1 null))'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, []) == []
def test_car(): source = ['(car (cons 1 null))'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, Environment([])) == 1
def test_or_false(): source = ['(or (> 2 10) (= 1 2) #f)'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, Environment([])) == False
def test_parse_add(): source = ['(define a (+ 3 3))'] tokens = tokenize(source) exp = parse_tokens(tokens) assert exp == [['define', 'a', ['+', 3, 3]]]
def test_nullcheck_3(): source = ['(null? (cdr (list 1)))'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, []) == True
def test_parse_define_lambda(): source = ['(define add (lambda (x y) (+ x y)))'] tokens = tokenize(source) exp = parse_tokens(tokens) assert exp == [['define', 'add', ['lambda', ['x', 'y'], ['+', 'x', 'y']]]]
def test_cons(): source = ['(cons (+ 1 3 5) null)'] exp = parse_tokens(tokenize(source))[0] assert eval_in_env(exp, Environment([])) == [9]
def test_parse_define(): source = ['(define a 3)'] tokens = tokenize(source) exp = parse_tokens(tokens) assert exp == [['define', 'a', 3]]