def test_apply(self): code = """ (define (sum lst) (if (eq? lst '()) 0 (+ (car lst) (sum (cdr lst))))) (define (map f lst) (if (eq? lst '()) '() (cons (f (car lst)) (map f (cdr lst))))) (sum (map car '((1 2 3) (4 5 6)))) """ ast = pyscm.parse(code) self.assertEqual(5, pyscm.evaluate(ast, pyscm.make_base())) code = """ ((lambda (x y) (+ x y)) 1 9) """ ast = pyscm.parse(code) self.assertEqual(10, pyscm.evaluate(ast, pyscm.make_base())) code = """ (define (func x y) (let ((z 3) (w 7)) (+ x w y z))) (func 9 9) """ ast = pyscm.parse(code) self.assertEqual(28, pyscm.evaluate(ast, pyscm.make_base()))
def test_if(self): t = pyscm.make_boolean(True) f = pyscm.make_boolean(False) ast = pyscm.parse('(if (> 2 1) 9 10)')[1] self.assertEqual(9, pyscm.evaluate(ast, pyscm.make_base())) ast = pyscm.parse('(if (> 1 2) 9 10)')[1] self.assertEqual(10, pyscm.evaluate(ast, pyscm.make_base())) ast = pyscm.parse('(if (> 2 3) 10)')[1] self.assertEqual(None, pyscm.evaluate(ast, pyscm.make_base())) ast = pyscm.parse('(if (< 2 3) 10)')[1] self.assertEqual(10, pyscm.evaluate(ast, pyscm.make_base()))
def test_tail(self): code = """ (define (sum2 n acc) (if (= n 0) acc (sum2 (- n 1) (+ n acc)))) (sum2 1000 0) """ self.assertEqual(500500, pyscm.run(code, pyscm.make_base()))
def test_cond(self): t = pyscm.make_boolean(True) f = pyscm.make_boolean(False) code = """ (define (f x) (cond ((< x 3) 1) ((< x 5) 44) (else 99) )) (define a (f 2)) (define b (f 4)) (define c (f 33)) """ ast = pyscm.parse(code) base = pyscm.make_base() pyscm.evaluate(ast, base) self.assertEqual(1, base['a']) self.assertEqual(44, base['b']) self.assertEqual(99, base['c'])