diff --git a/simulator-prims.rkt b/simulator-prims.rkt index edc3752..0755bef 100644 --- a/simulator-prims.rkt +++ b/simulator-prims.rkt @@ -32,5 +32,9 @@ (provide lookup-primitive) (define lookup-primitive (make-lookup #:functions (+ - * / = < <= > >= cons list car cdr sub1 - display newline displayln) + display newline displayln + not + pair? + eq? + null?) #:constants (null pi e))) diff --git a/test-compiler.rkt b/test-compiler.rkt index 0f140c5..ccd9f71 100644 --- a/test-compiler.rkt +++ b/test-compiler.rkt @@ -206,6 +206,7 @@ (f 1000)) #:stack-limit 8) + ;; And from experimental testing, anything below 7 will break. (test/exn (begin (define (f x acc) (if (= x 0) @@ -233,6 +234,42 @@ 7) +;; deriv +(test (begin (define (deriv-aux a) (list '/ (deriv a) a)) + (define (map f l) + (if (null? l) + l + (cons (f (car l)) + (map f (cdr l))))) + (define (deriv a) + (if (not (pair? a)) + (if (eq? a 'x) 1 0) + (if (eq? (car a) '+) + (cons '+ (map deriv (cdr a))) + (if (eq? (car a) '-) + (cons '- (map deriv + (cdr a))) + (if (eq? (car a) '*) + (list '* + a + (cons '+ (map deriv-aux (cdr a)))) + (if (eq? (car a) '/) + (list '- + (list '/ + (deriv (cadr a)) + (caddr a)) + (list '/ + (cadr a) + (list '* + (caddr a) + (caddr a) + (deriv (caddr a))))) + 'error)))))) + (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))) + '(+ (* (* 3 x x) (+ (/ 0 3) (/ 1 x) (/ 1 x))) + (* (* a x x) (+ (/ 0 a) (/ 1 x) (/ 1 x))) + (* (* b x) (+ (/ 0 b) (/ 1 x))) + 0)) ;(simulate (compile (parse '42) 'val 'next))