Skip to content

Instantly share code, notes, and snippets.

@AquaMorph
Created October 2, 2016 19:39
Show Gist options
  • Save AquaMorph/f728f1ed89463b0d183b95c431899b8c to your computer and use it in GitHub Desktop.
Save AquaMorph/f728f1ed89463b0d183b95c431899b8c to your computer and use it in GitHub Desktop.
; Name: Christian Colglazier
; Date: 9-28-16
(define (eval-expr E env)
(cond
; If E is a number than it stays a number
((number? E) E)
; Handles varibales
((symbol? E) (if (pair? (cadr (assoc E env)))
(set-car! (cdr (assoc E env))
(eval-expr (caadr (assoc E env)) (cadadr (assoc E env)))
)
)
(cadr (assoc E env))
)
; Handles let
((eqv? (car E) 'let) (let* ((x (caadr E))
(a (cadadr E))
(b (caddr E))
(r (eval-expr a env))
(newenv (cons (list x r) env)) )
(eval-expr b newenv))
)
; Handles call
((eqv? (car E) 'call) (eval-expr (caddr E) env) (display (cadr E)))
; Handles fucntions
((eqv? (car E) 'function) (lambda (cadr E) (caadr E)))
; Handles basic math operator
((eqv? (car E) 'plus) (apply + (eval-params (cdr E) env)))
((eqv? (car E) 'minus) (apply - (eval-params (cdr E) env)))
((eqv? (car E) 'times) (apply * (eval-params (cdr E) env)))
((eqv? (car E) 'divide) (apply / (eval-params (cdr E) env)))
; If operator
((eqv? (car E) 'if) (if (= (eval-expr (cadr E) env) 0) (eval-expr (cadddr E) env)(eval-expr (caddr E) env)))
(else '())
)
)
(define (eval-params E env)
(if (null? E) '()
(cons (eval-expr (car E) env) (eval-params (cdr E) env))
)
)
; tests function and displays if it works or not.
(define (tester E env answer d)
(cond
((eqv? d 0)(cond
((eq? (eval-expr E env) answer) (display "Works for ")
(display E) (display " produced ") (display (eval-expr E env)) (newline))
(else (display "!! Failed for ") (display E) (display " produced ") (display (eval-expr E env))(newline))
))
(else (display (eval-expr E env)) (newline))
)
)
; Sets the output mode of the test fucntion.
(define (test-mode) 0)
; Test fucntions based on examples from the assignment.
(define (test)
(tester '(plus 3 5 4) '() 12 (test-mode))
(tester '(times 3 5 4) '() 60 (test-mode))
(tester '(minus 5 2 1) '() 2 (test-mode))
(tester '(divide 10 5) '() 2 (test-mode))
(tester '(divide 10 5 2) '() 1 (test-mode))
(tester '(if (plus 1 2) (minus 3 5) (plus 5 6)) '() -2 (test-mode))
(tester '(if (minus 2 2) (minus 3 5) (plus 5 6)) '() 11 (test-mode))
(tester '(if (minus 2.0 2.0) (minus 3 5) (plus 5 6)) '() 11 (test-mode))
(tester 'y '((y 20)) 20 (test-mode))
(tester '(let (y (plus 1 4)) (times y y)) '() 25 (test-mode))
(tester '(function d (plus d 1)) '() 4 (test-mode))
(tester '(call (function z (plus z z)) (plus 5 3)) '() 16 (test-mode))
;Examples given from the assignment
(tester '(plus 2 3) '( ) 5 (test-mode))
(tester '(plus (times 2 3) (minus 4 2)) '( ) 8 (test-mode))
(tester '(if (times 2 4) (plus 1 8) (divide 5 0)) '( ) 9 (test-mode))
(tester '(if (minus 5 5) (divide 1 0) (plus 1 8)) '( ) 9 (test-mode))
(tester 'x '((y 2) (x 5)) 5 (test-mode))
(tester '(times x 3) '((x 5) (y 2)) 15 (test-mode))
(tester '(times x 3) '((x 5) (x 2)) 15 (test-mode))
(tester '(let (z 15) (plus z z)) '( ) 30 (test-mode))
(tester '(let (r (plus 2 5)) (times r 2)) '( ) 14 (test-mode))
(tester '(let (s 5) (let (t (plus s s)) (times s (plus t 3)))) '( ) 65 (test-mode))
(tester '(let (f (function z (times z (plus w 1))))(call f (times 2 a))) '((a 5) (w 20)) 210 (test-mode))
)
(test)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment