def test_eval_string_recursion(self): area = eval_string(''' (define fact (lambda n (if (<= n 1) 1 (* n (fact (- n 1)))))) (fact 10) ''') self.assertEqual(area, 3628800) expected = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 self.assertEqual(eval_string('(fact 100)'), expected)
def test_expr_from_tokens(self): self.assertEqual( expr_from_tokens(['(', '1', '2', '3', ')']), [1, 2, 3] ) with self.assertRaises(SyntaxError) as cm: eval_string('(') with self.assertRaises(SyntaxError): expr_from_tokens([')']) self.assertEqual(str(cm.exception), 'Unexpected ")"')
def test_eval_string_define_procedure(self): area = eval_string(''' (define pi 3.14159) (define area (lambda (r) (* pi (* r r)))) (area 3) ''') self.assertEqual(area, 28.27431)
def test_eval_string(self): data = [ ('100', 100), ('100 200', 200), ('(+ 1 2 (+ 30 40 50) 3)', 126), ('(* 2 3 (* 5 6 7) 4)', 5040), ('(- 100 (- (- 50 20) 5))', 75), ('(/ 360 (/ (/ 60 2) 10))', 120), ] for string, value in data: self.assertEqual(eval_string(string), value)
def test_eval_string_car_cdr(self): count = eval_string(''' (define first car) (define rest cdr) (define count ( lambda (item L) (if L (+ (equal? item (first L)) (count item (rest L))) 0 ) ) ) (count 0 (list 0 1 2 3 0 0)) ''') self.assertEqual(count, 3) count2 = eval_string(''' (count (quote the) (quote (the more the merrier the bigger the better)) ) ''') self.assertEqual(count2, 4)
def test_eval_string_lambda(self): proc = eval_string('(lambda (x) (+ x 4))') self.assertEqual(proc(10), 14)
def test_eval_string_with_vars(self): env = Env({'a':2, 'b':30, 'c':4}, global_env) self.assertEqual(eval_string('(+ a 3 (+ b 40 50) c)', env), 129)