def test_let_creates_a_new_escope(self): e = env() assert run( '''(begin (define x 1) (let ((x 2) (y 40)) (+ x y)) )''', e) == 42 assert e[x] == 1
def test_lambda_defines_an_independent_scope(self): e = env() fn = run( '''(begin (define x 10) (lambda (x y) (+ x y)) )''', e) assert callable(fn) assert fn(1, 2) == 3 assert fn(40, 2) == 42 assert e[x] == 10
def test_collatz_example(self, example): e = env() run(example('collatz.lispy'), e) assert e[var.collatz](10) == [10, 5, 16, 8, 4, 2, 1]
def test_factorial_example(self, example): e = env() run(example('fat.lispy'), e) assert e[var.fat](5) == 120 assert e[var.fat](10) == 3628800
def test_lisp_fibo_example(self, example): e = env() run(example('lisp-fibo.lispy'), e) assert e[var.fibo](5) == [1, 1, 2, 3, 5] assert e[var.fibo](10) == [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
def test_defn(self): e = env() assert run(':defn incr x: (+ x 1)', e) is None assert e[Symbol('incr')](41) == 42
def test_eval_define_nested(self): e = env() assert run("(define x (+ 40 2))", e) is None assert e[Symbol('x')] == 42
def test_eval_define_simple(self): e = env() assert run("(define x 42)", e) is None assert e[Symbol('x')] == 42
def test_env_creation(self): assert env() == global_env assert set(env({var.x: 42})).issuperset(set(global_env)) assert env({var.x: 42})[var.x] == 42 assert env(x=42)[var.x] == 42