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)]))