def test_dotted(self): self.assertEqual( visp.read("(1 . hello)").cdr.name, 'hello') self.assertEqual( visp.read("(1 . hello)").car, 1)
def test_list_of_pairs(self): self.assertEqual( visp.read("((1 . 2) (3 . 4) (5 . 6))"), visp.cons( visp.cons(1, 2), visp.cons(visp.cons(3, 4), visp.cons(visp.cons(5, 6), visp.nil))))
def test_simple_macro(self): self.assertEqual( visp.evaluate_many(visp.read_many( """(defmacro foo (x) (list '+ '1 '2 x)) (foo 3)"""), self.base_env), visp.read("6"))
def test_viral_inexactness(self): test_cases = { "(+ #e100 #e100)": Exact, "(+ #e100 #i100)": Inexact, "(+ #i100 #e100)": Inexact, "(+ #i100 #i100)": Inexact, } for input_string, expected_type in test_cases.items(): self.assertTrue(isinstance( visp.evaluate(visp.read(input_string), self.base_env), expected_type))
def test_debug_macroexpand(self): self.assertEqual( visp.evaluate_many(visp.read_many( """(defmacro debug (a) (list 'let (list (list 'x a)) (list 'print 'x) 'x)) (macroexpand (debug "hello"))"""), self.base_env), visp.read( """(let ((x "hello")) (print x) x)"""))
def test_viral_inexactness(self): test_cases = { "(+ #e100 #e100)": Exact, "(+ #e100 #i100)": Inexact, "(+ #i100 #e100)": Inexact, "(+ #i100 #i100)": Inexact, } for input_string, expected_type in test_cases.items(): self.assertTrue( isinstance( visp.evaluate(visp.read(input_string), self.base_env), expected_type))
def test_quote(self): self.assertEqual( visp.evaluate(visp.read( "'(1 2 3)"), visp.Env()).car, 1)
def test_inexact(self): self.assertEqual( visp.evaluate(visp.read("#i10"), visp.Env()), 10.0)
def assertEvalEqual(self, actual, expected): self.assertEqual( visp.evaluate(visp.read(actual), self.base_env), visp.evaluate(visp.read(expected), self.base_env))
def test_inexact_add(self): self.assertEqual( visp.evaluate(visp.read( """(+ #i100 #i100)""" ), visp.Env()), 200.0)
def test_unmet_token_requirement(self): with self.assertRaises(StopIteration): visp.read("(1 2")
def test_unexpected_token(self): with self.assertRaises(RuntimeError): visp.read(")")
def test_integer(self): self.assertEqual(visp.read("1"), 1)
def test_inexact(self): self.assertEqual(visp.read("#i100"), visp.read('(inexact-number 100)'))
def test_quote(self): self.assertEqual(visp.read("'(1 2 3)"), visp.read("(quote (1 2 3))"))
def test_integers_dot_nil(self): self.assertEqual(visp.read("(1 2 3 . ())"), visp.cons(1, visp.cons(2, visp.cons(3, visp.nil))))
def test_nil(self): self.assertEqual(visp.read("()"), visp.nil)
def test_nested(self): self.assertEqual(visp.read("((1 . 2) . (3 . 4))"), visp.cons(visp.cons(1, 2), visp.cons(3, 4)))
def test_unexpected_readermacro(self): with self.assertRaises(RuntimeError): visp.read("#oblong")
def test_symbol(self): self.assertEqual(visp.evaluate(visp.read("a"), visp.Env({'a': 2})), 2)
def assertEvalEqual(self, actual, expected): self.assertEqual(visp.evaluate(visp.read(actual), self.base_env), visp.evaluate(visp.read(expected), self.base_env))
def test_symbol(self): self.assertEqual(visp.read("hello!").name, 'hello!')
def test_nil(self): self.assertEqual( visp.read("()"), visp.nil)
def test_symbol(self): self.assertEqual( visp.read("hello!").name, 'hello!')
def setUp(self): self.base_env = visp.Env() self.base_env.set( 'print', visp.evaluate(visp.read("(lambda x x)"), self.base_env)) visp.load_prelude(self.base_env)
def test_sub_mixed(self): self.assertEqual( visp.evaluate(visp.read( "(- #i100 #e20 #e40 #e1)" ), visp.Env()), 39.0)
def test_exact(self): self.assertEqual( visp.evaluate(visp.read("1"), visp.Env()), 1)
def setUp(self): self.base_env = visp.Env() self.base_env.set('print', visp.evaluate(visp.read( "(lambda x x)"), self.base_env)) visp.load_prelude(self.base_env)
def default(self, line, to_string=str): try: print(to_string(visp.evaluate(visp.read(line), self.env))) except Exception as exc: print(traceback.format_exc())
def test_symbol(self): self.assertEqual( visp.evaluate(visp.read("a"), visp.Env({ 'a': 2 })), 2)
def test_sub_mixed(self): self.assertEqual( visp.evaluate(visp.read("(- #i100 #e20 #e40 #e1)"), visp.Env()), 39.0)
def test_nested(self): self.assertEqual( visp.read("((1 . 2) . (3 . 4))"), visp.cons(visp.cons(1, 2), visp.cons(3, 4)))
def test_dotted(self): self.assertEqual(visp.read("(1 . hello)").cdr.name, 'hello') self.assertEqual(visp.read("(1 . hello)").car, 1)
def test_list_of_pairs(self): self.assertEqual( visp.read("((1 . 2) (3 . 4) (5 . 6))"), visp.cons(visp.cons(1, 2), visp.cons(visp.cons(3, 4), visp.cons(visp.cons(5, 6), visp.nil))))
def test_inexact_add(self): self.assertEqual( visp.evaluate(visp.read("""(+ #i100 #i100)"""), visp.Env()), 200.0)
def test_integer(self): self.assertEqual( visp.read("1"), 1)
def test_inexact(self): self.assertEqual(visp.evaluate(visp.read("#i10"), visp.Env()), 10.0)
def test_integers_dot_nil(self): self.assertEqual( visp.read("(1 2 3 . ())"), visp.cons(1, visp.cons(2, visp.cons(3, visp.nil))))
def test_quote(self): self.assertEqual( visp.evaluate(visp.read("'(1 2 3)"), visp.Env()).car, 1)
def test_quote(self): self.assertEqual( visp.read("'(1 2 3)"), visp.read("(quote (1 2 3))"))
def test_exact(self): self.assertEqual(visp.evaluate(visp.read("1"), visp.Env()), 1)
def test_inexact(self): self.assertEqual( visp.read("#i100"), visp.read('(inexact-number 100)'))