What you should be envisioning at this point is something along the lines of a little switch statement and a lot of recursion. This is exactly what the interpreter looks like. Its crux is a function by the name of evaluateSExp 10 which does precisely what it claims. It gets a little help from it's friend functions when it comes to manipulating the values of variables and creating a local environment for a function call, but sooner or later, everyone ends up back at good old evaluateSExp. Variable value manipulation is achieved very simply by storing the variable bindings in a Hashtable object.
Lookups retrieve the atom from the hash table, sets store an atom into the hash table.
The interpreter uses dynamic scoping when binding values to variables. Bear in mind that later on, another function could define a variable of the same name which would shadow the first value until the return of the second defining function. To achieve this, when variables are bound, their previous value is placed into a shadowed table until the completion of the binding construct at which time their old values are restored to the environment. This implementation is known as shallow binding. Another implementation called deep binding achieves this same result but with lesser efficiency.