Lisp style Calculator

Lets create a very simple lisp based calculator that works with two numbers as another example of using variable path elements. As its a Lisp calculator, then we will use prefix notation (the 'operator' comes first)

Create a route for the calculator

``````(defroutes app
(GET "/" [] greet)
(GET "/goodbye" [] goodbye)
(GET "/request-info" [] handle-dump)
(GET "/hello/:name" [] hello)
(GET "/calculator/:op/:a/:b" [] calculator)
``````

Create a handler function to add, subtract, divide or multiply two numbers

``````(defn calculator
"A very simple calculator that can add, divide, subtract and multiply.  This is done through the magic of variable path elements."
[request]
(let [a  (Integer. (get-in request [:route-params :a]))
b  (Integer. (get-in request [:route-params :b]))
op (get-in request [:route-params :op])
f  (get operands op)]
(if f
{:status 200
:body (str "Calculated result: " (f a b))
{:status 404
:body "Sorry, unknown operator.  I only recognise + - * : (: is for division)"
``````

Create a dictionary to look up Clojure function names

Define a hash-map called `operands` to look up the names of the mathematical operations (operands) to the actual functions in Clojure

``````(def operands {"+" + "-" - "*" * ":" /})
``````

Try the calculator out like follows http://localhost:8000/calculator/*/6/7

With all the changes from above, the code should look as follows

``````(def operands {"+" + "-" - "*" * ":" /})
``````
``````(defn calculator
"A very simple calculator that can add, divide, subtract and multiply.  This is done through the magic of variable path elements."
[request]
(let [a  (Integer. (get-in request [:route-params :a]))
b  (Integer. (get-in request [:route-params :b]))
op (get-in request [:route-params :op])
f  (get operands op)]
(if f
{:status 200
:body (str (f a b))
{:status 404
:body "Sorry, unknown operator.  I only recognise + - * : (: is for division)"
``````
``````(defroutes app
(GET "/" [] welcome)
(GET "/goodbye" [] goodbye)