I wrote a simple Scheme/Lisp like interpreter some time ago. It was just a dumb idea after hours of of Scheme programming at university ;)
It currently supports define, quote, cdr, car, some arithmetical operations and even lambda functions.
If you want to extend the interpreter, you have to bind a new function to the global environment.
For car it looks like that:
def car_builtin(l, env, interp):
assert len(l) == 1
v = l.head().visit(interp, env)
return v.head()
env = Environment()
env.bind("car", Function(car_builtin))
There is a simple example script in the SVN repository to calculate the faculty of a given number.
(define fac
(lambda (f)
(if (< f 2) 1 (* (fac (- f 1)) f))
)
)
Call fac with
(fac 11)
and you you'll get the correct result: 39916800. hehe.
The complete python script can be downloaded from Google Code (http://code.google.com/p/dev-null). It only consists of a few lines of code for scanner, parser, AST, "runtime library" and interpreter.