def test_items(self): env = Env() self.assertListEqual(list(env.items()), []) for i in range(10): env[i] = i self.assertEqual(list(range(10)), sorted([k for k, _ in env.items()])) self.assertEqual(list(range(10)), sorted([v for _, v in env.items()]))
def test_shadowing(self): env = Env() new_env_a = env.extend('x', 2) new_env_b = new_env_a.extend('x', 5) # Make sure new_env didnt change, but new_env_2 did with self.assertRaises(ValueError): env['x'] self.assertEqual(2, new_env_a['x']) self.assertEqual(5, new_env_b['x'])
def test_extend(self): env = Env() env['a'] = 1 new_env = env.extend('x', 2) # Original environment should not change self.assertEqual(1, env['a']) with self.assertRaises(ValueError): env['x'] self.assertEqual(1, new_env['a']) self.assertEqual(2, new_env['x'])
def make_env(): env = Env() env['*debug*'] = Atom(False) Define(List(Symbol('cons'), Symbol('a'), Symbol('b')), InterOp(lambda a, b: (a, b), Symbol('a'), Symbol('b'))).eval(env) Define(List(Symbol('first'), Symbol('a')), InterOp(lambda a: a[0], Symbol('a'))).eval(env) Define(List(Symbol('rest'), Symbol('a')), InterOp(lambda a: a[1], Symbol('a'))).eval(env) Define( Symbol('<'), Lambda(List(Symbol('a'), Symbol('b')), InterOp(operator.lt, Symbol('a'), Symbol('b')))).eval(env) Define( Symbol('*'), Lambda(List(Symbol('a'), Symbol('b')), InterOp(operator.mul, Symbol('a'), Symbol('b')))).eval(env) Define( Symbol('+'), Lambda(List(Symbol('a'), Symbol('b')), InterOp(operator.add, Symbol('a'), Symbol('b')))).eval(env) Define( Symbol('-'), Lambda(List(Symbol('a'), Symbol('b')), InterOp(operator.sub, Symbol('a'), Symbol('b')))).eval(env) Define( Symbol('='), Lambda(List(Symbol('a'), Symbol('b')), InterOp(operator.eq, Symbol('a'), Symbol('b')))).eval(env) Define(Symbol('zero?'), Lambda(List(Symbol('n')), List(Symbol('='), Symbol('n'), Atom(0)))).eval(env) return env
def test_set_local_doesnt_bleed(self): env = Env() env['a'] = 12 # Global frame extended_env = env.extend('a', 16) # local shadowing self.assertEqual(12, env['a']) self.assertEqual(16, extended_env['a']) # Now update global 'a' in original env - check it doesnt bleed into extended env['a'] = 50 self.assertEqual(50, env['a']) self.assertEqual(16, extended_env['a']) # Update 'a' in extended_env, check no bleeding again extended_env.set_local('a', 46) self.assertEqual(50, env['a']) self.assertEqual(46, extended_env['a'])
def test_counter_diff_environments(self): env1 = Env() start_counter = env1.next_id() env2 = Env() next_counter = env2.next_id() last_counter = env1.next_id() self.assertEqual(next_counter, start_counter + 1) self.assertEqual(last_counter, start_counter + 2)
def create_initial_env(): env = Env() with log_progress("Creating initial environment"): bootstrap_special_forms(env) bootstrap_python_functions(env) for lib in __core_libraries__: with log_progress("Loading library: " + lib): bootstrap_lisp_functions(env, "../../core/{0}.ylx".format(lib)) return env
def test_freevars(self): env = Env() env = env.extend('a', 3) env = env.extend('b', 17) env = env.extend('c', 6) for x in range(10): env = env.extend('b', x) env = env.extend('b', 55) env = env.extend('c', 12) self.assertEqual(3, env['a']) self.assertEqual(55, env['b']) self.assertEqual(12, env['c']) # Check local stack does not have excessive content self.assertEqual(3, len(env.local_stack))
def gensym(prefix='G__'): return Symbol(prefix + str(Env.next_id()))
def eval(self, env): if SyntaxQuote.ID not in env: env = env.extend(SyntaxQuote.ID, Env.next_id()) return self.expr.quoted_form(env)
def test_define(self): env = Env() env['a'] = 1 self.assertEqual(1, env['a'])
def test_non_existent_set_local(self): env = Env() with self.assertRaises(ValueError): env['a'] with self.assertRaises(ValueError): env.set_local('a', 5)
def test_contains(self): env = Env() self.assertFalse('a' in env) extended_env = env.extend('a', 16) self.assertFalse('a' in env) self.assertTrue('a' in extended_env)
def test_contains(self): env = Env() self.assertFalse('a' in env) env['a'] = 2 self.assertTrue('a' in env)
def test_counter_increments(self): env = Env() start_counter = env.next_id() next_counter = env.next_id() self.assertEqual(next_counter, start_counter + 1)
def test_overwrite(self): env = Env() env['a'] = 1 env['a'] = 2 self.assertEqual(2, env['a'])
def test_lookup_fails(self): env = Env() with self.assertRaises(ValueError): env['a']