コード例 #1
0
ファイル: test_functions.py プロジェクト: ncollins/lis.py
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"'
コード例 #2
0
ファイル: lis.py プロジェクト: ncollins/lis.py
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 ***')
コード例 #3
0
ファイル: test_functions.py プロジェクト: ncollins/lis.py
def test_add():
    source = ['(+ 1 3 5)']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, Environment([])) == 9
コード例 #4
0
ファイル: test_functions.py プロジェクト: ncollins/lis.py
def test_and_false():
    source = ['(and (> 2 1) (= 1 2) #t)']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, Environment([])) == False
コード例 #5
0
ファイル: test_functions.py プロジェクト: ncollins/lis.py
def test_divide():
    source = ['(/ 10 3)']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, Environment([])) == 3
コード例 #6
0
ファイル: test_functions.py プロジェクト: ncollins/lis.py
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
コード例 #7
0
ファイル: test_functions.py プロジェクト: ncollins/lis.py
def test_multiply():
    source = ['(* 1 3 5)']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, Environment([])) == 15
コード例 #8
0
ファイル: test_functions.py プロジェクト: ncollins/lis.py
def test_subtract():
    source = ['(- 10 14)']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, Environment([])) == -4
コード例 #9
0
ファイル: lis.py プロジェクト: ncollins/lis.py
            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()
コード例 #10
0
ファイル: test_parser.py プロジェクト: ncollins/lis.py
def test_parse_unexpected_closing_paren():
    source = ['(define add 3))']
    tokens = tokenize(source)
    with pytest.raises(LisSyntaxError) as e:
        exp = parse_tokens(tokens)
コード例 #11
0
ファイル: test_lists.py プロジェクト: ncollins/lis.py
def test_nullcheck():
    source = ['(null? null)']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, []) == True
コード例 #12
0
ファイル: test_lists.py プロジェクト: ncollins/lis.py
def test_nullcheck_2():
    source = ['(null? (cons 1 null))']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, []) == False
コード例 #13
0
ファイル: test_lists.py プロジェクト: ncollins/lis.py
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]
コード例 #14
0
ファイル: test_lists.py プロジェクト: ncollins/lis.py
def test_cdr():
    source = ['(cdr (cons 1 null))']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, []) == []
コード例 #15
0
ファイル: test_lists.py プロジェクト: ncollins/lis.py
def test_car():
    source = ['(car (cons 1 null))']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, Environment([])) == 1
コード例 #16
0
ファイル: test_functions.py プロジェクト: ncollins/lis.py
def test_or_false():
    source = ['(or (> 2 10) (= 1 2) #f)']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, Environment([])) == False
コード例 #17
0
ファイル: test_parser.py プロジェクト: ncollins/lis.py
def test_parse_add():
    source = ['(define a (+ 3 3))']
    tokens = tokenize(source)
    exp = parse_tokens(tokens)
    assert exp == [['define', 'a', ['+', 3, 3]]]
コード例 #18
0
ファイル: test_lists.py プロジェクト: ncollins/lis.py
def test_nullcheck_3():
    source = ['(null? (cdr (list 1)))']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, []) == True
コード例 #19
0
ファイル: test_parser.py プロジェクト: ncollins/lis.py
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']]]]
コード例 #20
0
ファイル: test_lists.py プロジェクト: ncollins/lis.py
def test_cons():
    source = ['(cons (+ 1 3 5) null)']
    exp = parse_tokens(tokenize(source))[0]
    assert eval_in_env(exp, Environment([])) == [9]
コード例 #21
0
ファイル: test_parser.py プロジェクト: ncollins/lis.py
def test_parse_define():
    source = ['(define a 3)']
    tokens = tokenize(source)
    exp = parse_tokens(tokens)
    assert exp == [['define', 'a', 3]]