Scheme Calculator

If you are a programmer, I highly recommend you learn some form of LISP, whether that be Scheme, Clojure, Racket, or Common Lisp. LISP has taught me a tremendous amount about interpreters, recursion, closures, macros, and mathematics. I built this simple calculator program after reading The Structure and Interpretation of Computer Programs by Harold Abelson, Gerald Jay Sussman, and Julie Sussman.

(define environment
  (list [cons '+ +]
        [cons '- -]
        [cons '* *]
        [cons  *]
        [cons '/ /]
        [cons  /]
        [cons '^ expt]
        [cons '√ sqrt]
        [cons  3.141592653589793]
        [cons 'e 2.718281828459045]
        [cons  1.618033988749894]))

(define (lookup variable environment)
  (let ([result (assq variable environment)])
    (if result
        (cdr result)
        (error "unbound operator or constant: " variable))))

(define (compute expression)
  (cond
    [(symbol? expression) (lookup expression environment)]
    [(number? expression) expression]
    [(pair? expression)
     (apply (compute (car expression))
            (map (lambda (x) (compute x))
                 (cdr expression)))]
    [else (error "invalid expression: " expression)]))
A Scheme calculator and symbolic interpreter.