Most functional languages allow functions to be treated as data.
In Lisp, since expressions and function calls have the same list format, we can create new code by simply calling the list constructors. If the constructed code has free variables in it, they will be dynamically bound during run-time. This can be an advantage or a nasty bug. The Lisp Interpreter reads a line of code, evaluates it, and then prints the result. Eval evaluates what is read.