# Simple 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)"
``````

Define a map called operands to match the string names of the mathematical operations (operands) to the actual functions in clojure

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

## All put togehter this looks like

``````(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 "/" [] greet)
(GET "/goodbye" [] goodbye)
(GET "/request-info" [] handle-dump)
(GET "/yo/:name" [] yo)
(GET "/calculator/:a/:op/:b" [] calculator)
``````

Try the calculator out like follows http://localhost:8000/calculator/2/+/3

## Complete code so far

Get the complete code so far from the branch `04-compojure`

``````git checkout 04-compjure
``````

If you havent got the repo already, get it by

``````git clone http://practicalli.github.io/clojure-webapps-example
``````