Wishful Coding

Didn't you ever wish your computer understood you?

5 minutes Lisp in Python

I love both Python and Clojure, so after I read this gist about a Lisp in Ruby, I decided to craft my own in Python.

The idea is basically to abuse a few Python functions, namely Generators, Decorators and grouping to have a syntax that looks like Lisp with yield at the start of every statement.

It's all still Python, so you can mix and mach however you like, I sneaked a List Comprehension in the example, which fits the Lisp syntax quite well.

At the moment of writing, the Gist below is also #3 on HackerNews.

# 5 minutes Lisp in Python
# Pepijn de Vos <http://pepijndevos.nl>
#
# Inspired by 30 minutes Lisp in Ruby
# http://gist.github.com/562017
#
# This Lisp does not read or parse anything at all.
# A generator and a Decorator are abused to run sexps.
#
# Usage:
#
# Define a function decorated with @lisp and start every sexp with yield.
#
# The function names should be strings.
#
# Result is stored in fn name.
#
# Example below:
#

def lisp(fn):
code = fn()
val = code.next()
while True:
try:
try:
newval = getattr(__builtins__, val[0])(*val[1:])
except AttributeError:
newval = getattr(val[1], val[0])(*val[2:])

val = code.send(newval)
except StopIteration:
return getattr(val[1], val[0])(*val[2:])

@lisp
def example():
(yield 'join',
", #",
(yield '__mul__',
[(yield 'str', i) for i in
(yield 'range', (yield '__add__', 5, 5))],
2))

print example
Pepijn de Vos