A small, minimalist LISP interpreter written in Python
This is a proof-of-concept work. As such, there will not be any stable releases.
Currently, pylisp only supports basic numeric LISP. It works with any of the listed operations.
In addition, it supports arbitrarily nested lists.
Finally, you can register new operators, mapping a name to a Python function.
All of the usage examples assume that pylisp has been imported: import pylisp.
The easiest way to use pylisp is with the Expression class. Simply pass a valid LISP expression (as a string) and it will be automatically parsed. Currently, pylisp does not check for validity, so an invalid expression will break things.
Let's start simple, with the LISP expression of (ADD 2 3):
expr = pylisp.Expression("(ADD 2 3)")
print expr.evaluate() # --> 5.0First, we create an expression by using the Expression class. Then, we evaluate it with the .evaluate method.
We can also have nested expressions:
expr = pylisp.Expression("(ADD 2 (MULT 5 3))")
print expr.evaluate() # --> 17.0Finally, we can use variables instead of numeric literals:
expr = pylisp.Expression("(ADD 2 (MULT A B) C)")
print expr.evaluate(A = 2, B = 5, C = 1) # --> 13There are a few standard LISP operators as well as a few custom operators that come included.
| Operator | Arguments | Mathematical equivalent |
|---|---|---|
| SUM | a, b, c, ... | Sum of {a, b, c, ...} |
| SUB | a, b | a - b |
| MULT | a, b, c, ... | Product of {a, b, c, ...} |
| DIV | a, b | a / b |
| EXP | a, b | a<sup<b |
| SQUARE | a | a2 |
| SQRT | a | a0.5 |
| CUBE | a | a3 |
| CUBERT | a | a1/3 |
| EQ | a, b | a == b |
| POS | a | a > 0 |
| NEG | a | a < 0 |
| MAX | a, b, c, ... | Maximum value of {a, b, c, ...} |
| MIN | a, b, c, ... | Minimum value of {a, b, c, ...} |
New operators can be registered using the Interpreter.register method:
def neq(a, b):
return a != b
Interpreter.register("NEQ", neq)
Interpreter.register("GE", lambda a, b: a > b)As shown, the .register method takes an operation name (a string) and an operator function. The function should accept numeric values and return a numeric (or Boolean) value.