def test_side_exit(self): ast = to_ast( expand(""" (let () (define (count-positive l sum) (if (null? l) sum (if (> (car l) 0) (count-positive (cdr l) (+ (car l) sum)) (count-positive (cdr l) sum) ))) (count-positive (list -1 1 1 1 1 -1 2 3 -5 1 2 2 -5 6 4 3 -5) 0)) """)) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Fixnum) return ov.value assert interp_w() == 27 self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def test_vector_get_set(self): ast = to_ast( expand(""" (letrec ([v (make-vector 1000 0)] [fill-square-vector (lambda (n) (if (< n 0) (vector-ref v 999) (begin (vector-set! v n (* n n)) (fill-square-vector (- n 1)))))] [sum-vector (lambda (n s) (if (< n 0) s (sum-vector (- n 1) (+ s (vector-ref v n)))))]) (begin (fill-square-vector 999) (sum-vector 999 0))) """)) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Fixnum) return val.value assert interp_w() == sum(i**2 for i in range(1000)) self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def _cons_map(self): from pycket.expand import expand_string from pycket.json import loads ast = to_ast( loads( expand_string(""" (letrec ([range-it (lambda (n a) (if (<= n 0) a (range-it (- n 1) (cons n a))))] [range (lambda (n) (range-it n '()))]) (foldl + 0 (range 1000))) """, wrap=True, stdlib=True))) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Fixnum) return ov.value assert interp_w() == 500500 self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def test_vector_get_set(self): ast = to_ast(expand(""" (letrec ([v (make-vector 1000 0)] [fill-square-vector (lambda (n) (if (< n 0) (vector-ref v 999) (begin (vector-set! v n (* n n)) (fill-square-vector (- n 1)))))] [sum-vector (lambda (n s) (if (< n 0) s (sum-vector (- n 1) (+ s (vector-ref v n)))))]) (begin (fill-square-vector 999) (sum-vector 999 0))) """)) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Fixnum) return val.value assert interp_w() == sum(i ** 2 for i in range(1000)) self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def test_anormal_append(self): ast = to_ast( expand(""" (let () (define (append-anormal a b) (if (null? a) b (let* ([ca (car a)] [cd (cdr a)] [ap (append-anormal cd b)]) (cons ca ap)))) (append-anormal (list 1 2 3 5 6 6 7 7 8 3 4 5 3 5 4 3 5 3 5 3 3 5 4 3) (list 4 5 6))) """)) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Object) return 1 assert interp_w() == 1 self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def test_let_append(self): ast = to_ast( expand(""" (let () (define (let-append a b) (let ([tst (null? a)]) (if tst b (cons (car a) (let-append (cdr a) b))))) (let-append (list 1 2 3 5 6 6 7 7 8 3 4 5 3 5 4 3 5 3 5 3 3 5 4 3) (list 4 5 6))) """))
def test_let_append(self): ast = to_ast(expand(""" (let () (define (let-append a b) (let ([tst (null? a)]) (if tst b (cons (car a) (let-append (cdr a) b))))) (let-append (list 1 2 3 5 6 6 7 7 8 3 4 5 3 5 4 3 5 3 5 3 3 5 4 3) (list 4 5 6))) """ ))
def test_setbang(self): ast = to_ast(expand("(let ([n 1000]) (letrec ([countdown (lambda () (if (< n 0) 1 (begin (set! n (- n 1)) (countdown))))]) (countdown)))")) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Fixnum) return ov.value assert interp_w() == 1 self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def test_countdown_vector_allocation(self): ast = to_ast(expand(""" (letrec ([countdown (lambda (n) (if (< n 0) 1 (let ([v (vector n 1)]) (countdown (- (vector-ref v 0) (vector-ref v 1))))))]) (countdown 1000))""")) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Fixnum) return ov.value assert interp_w() == 1 self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def test_countdown_vector_allocation(self): ast = to_ast( expand(""" (letrec ([countdown (lambda (n) (if (< n 0) 1 (let ([v (vector n 1)]) (countdown (- (vector-ref v 0) (vector-ref v 1))))))]) (countdown 1000))""")) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Fixnum) return ov.value assert interp_w() == 1 self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def test_setbang(self): ast = to_ast( expand( "(let ([n 1000]) (letrec ([countdown (lambda () (if (< n 0) 1 (begin (set! n (- n 1)) (countdown))))]) (countdown)))" )) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Fixnum) return ov.value assert interp_w() == 1 self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def _cons_map(self): from pycket.expand import expand_string from pycket.json import loads ast = to_ast(loads(expand_string(""" (letrec ([range-it (lambda (n a) (if (<= n 0) a (range-it (- n 1) (cons n a))))] [range (lambda (n) (range-it n '()))]) (foldl + 0 (range 1000))) """, wrap=True, stdlib=True))) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Fixnum) return ov.value assert interp_w() == 500500 self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def test_side_exit(self): ast = to_ast(expand(""" (let () (define (count-positive l sum) (if (null? l) sum (if (> (car l) 0) (count-positive (cdr l) (+ (car l) sum)) (count-positive (cdr l) sum) ))) (count-positive (list -1 1 1 1 1 -1 2 3 -5 1 2 2 -5 6 4 3 -5) 0)) """)) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Fixnum) return ov.value assert interp_w() == 27 self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
def test_anormal_append(self): ast = to_ast(expand(""" (let () (define (append-anormal a b) (if (null? a) b (let* ([ca (car a)] [cd (cdr a)] [ap (append-anormal cd b)]) (cons ca ap)))) (append-anormal (list 1 2 3 5 6 6 7 7 8 3 4 5 3 5 4 3 5 3 5 3 3 5 4 3) (list 4 5 6))) """ )) def interp_w(): val = interpret_one(ast) ov = check_one_val(val) assert isinstance(ov, W_Object) return 1 assert interp_w() == 1 self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)