def test_quasiquote(): assert lsp("`(+ 1 2)") == lsp("'(+ 1 2)") loc = Env({'x': 2}, parent=top) assert lsp("(eval `(+ 1 ~x))", env=loc) == 3 loc = Env({'x': [3, 4]}, parent=top) assert lsp("`(+ 1 2 ~@x)", env=loc) == read("(+ 1 2 3 4)")
def test_fn(): assert lsp('((fn () 1))') == 1 assert lsp('((fn (x) x) 1)') == 1 assert lsp('((fn (x) (+ x 1)) 1)') == 2 assert read('(fn (x & xs) xs)') == \ List(['fn', List(['x', '&', 'xs']), 'xs']) assert lsp('((fn (x & xs) xs) 1 2 3 4)') == List([2, 3, 4])
def test_read_quote(): assert read("'x") == read('(quote x)') assert read("'(1 2)") == read("(quote (1 2))") assert read("'((1 2))") == read("(quote ((1 2)))") assert read("'((1 2) (3 4))") == read("(quote ((1 2) (3 4)))") assert read("(= '1 '(2 3))") == read("(= (quote 1) (quote (2 3)))") assert read("(= '(1 2) '3)") == read("(= (quote (1 2)) (quote 3))")
def test_repr(): assert str(read('1')) == '1' assert str(read('"hello"')) == '"hello"' assert str(read('(1 2 3)')) == '(1 2 3)'
def test_read_func(): assert read('(+ 1 2)') == List(['+', 1, 2]) assert read('(fn (x) (+ x 1))') == \ List(['fn', List(['x']), List(['+', 'x', 1])])
def test_do(): assert eval(read('(do 1 2)')) == 2
def lsp(source, env=top): return eval(read('(do {0})'.format(source)), env=env)