Esempio n. 1
0
 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()]))
Esempio n. 2
0
    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'])
Esempio n. 3
0
    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'])
Esempio n. 4
0
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
Esempio n. 5
0
    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'])
Esempio n. 6
0
 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)
Esempio n. 7
0
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
Esempio n. 8
0
    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))
Esempio n. 9
0
def gensym(prefix='G__'):
    return Symbol(prefix + str(Env.next_id()))
Esempio n. 10
0
def gensym(prefix='G__'):
    return Symbol(prefix + str(Env.next_id()))
Esempio n. 11
0
 def eval(self, env):
     if SyntaxQuote.ID not in env:
         env = env.extend(SyntaxQuote.ID, Env.next_id())
     return self.expr.quoted_form(env)
Esempio n. 12
0
 def test_define(self):
     env = Env()
     env['a'] = 1
     self.assertEqual(1, env['a'])
Esempio n. 13
0
 def test_non_existent_set_local(self):
     env = Env()
     with self.assertRaises(ValueError):
         env['a']
     with self.assertRaises(ValueError):
         env.set_local('a', 5)
Esempio n. 14
0
 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)
Esempio n. 15
0
 def eval(self, env):
     if SyntaxQuote.ID not in env:
         env = env.extend(SyntaxQuote.ID, Env.next_id())
     return self.expr.quoted_form(env)
Esempio n. 16
0
 def test_contains(self):
     env = Env()
     self.assertFalse('a' in env)
     env['a'] = 2
     self.assertTrue('a' in env)
Esempio n. 17
0
 def test_counter_increments(self):
     env = Env()
     start_counter = env.next_id()
     next_counter = env.next_id()
     self.assertEqual(next_counter, start_counter + 1)
Esempio n. 18
0
 def test_overwrite(self):
     env = Env()
     env['a'] = 1
     env['a'] = 2
     self.assertEqual(2, env['a'])
Esempio n. 19
0
 def test_lookup_fails(self):
     env = Env()
     with self.assertRaises(ValueError):
         env['a']