6 ms·
Adder: Python with a Lisp
- metageek 16y agoThis is the language I presented two years ago at the 2009 International Lisp Conference. It's finally ready for people to try out. From the documentation: Adder is a Lisp-1 which compiles to Python. It aims to integrate seamlessly into Python: every Adder function is a Python function, every Adder list is a Python list, etc. Python-on-Lisp has been tried before; I think Adder has two advantages that previous attempts did not. The first is technical: Python's metaprogramming has gotten better in the past few years, which allows Adder to integrate more smoothly. The second is social: Clojure has prepared the ground for the notion of a Lisp that integrates into an existing language. It has one bit of non-Lispy syntax: foo.bar.baz means exactly what it does in Python, and .bar.baz is a function, defined so that (.bar.baz foo) is identical to foo.bar.baz.
- julian37 16y agoHi, thanks -- this looks great! Does it support tail recursion (in constant space)?
- metageek 16y agoNo, because it compiles to Python. I suppose I could finagle some way to manage it for self-calls, by putting the whole function in a loop. Although that would bind the function name earlier than usual for Python. In Python, you can (in theory) do this: def fact(n,sofar): if n<2: return sofar else: return fact(n-1,n*sofar) f=fact fact=lambda n,sofar: 3 ...whereupon f(7,1)==3. I suppose I wouldn't really mind if Adder broke that consistently, but I don't think I like the idea of breaking it only for functions that do self-tail-calls.
- ckcheng 16y agoHow about considering Clojure's style of using recur to support self-tail-call optimization using explicit syntax?
- metageek 16y agoHmm. Maybe. I'd have to look closer. My main resistance is that I've used languages where you have to use special syntax for a recursive function, and I hate it. But this isn't quite the same thing.
- silentbicycle 16y agoDoes it really make sense to add a workaround-to-a-workaround?
- julian37 16y agoHave you considered using a "trampoline" function like this? http://paulbutler.org/archives/tail-recursion-in-python/ http://paulbutler.org/archives/tail-recursion-in-python/
- metageek 16y agoInteresting...no, I hadn't seen that before. I'll think about it.
- silentbicycle 16y agoYou'll get a lot out of _Lisp in Small Pieces_ (http://pagesperso-systeme.lip6.fr/Christian.Queinnec/WWW/LiSP.html http://pagesperso-systeme.lip6.fr/Christian.Queinnec/WWW/LiS...), as well. Python wouldn't be my first choice, and I'm unconvinced that Lisp-Py makes sense, but I'm sure you'll find ways to adapt it regardless.
- runningdogx 16y agoA flag to enable targeting stackless python instead of normal python?
- rednum 16y agoI gave it a quick look and I wonder why would I want to use it? I am a fan of both lisp and python and enjoy trying new languages but why would I want to use it instead of one of those languages? What exactly cool features does it offer?
- metageek 16y agoWell, the main one is that you combine access to Python libraries with Lisp macros.
- sedachv 16y agoIn case you're wondering, you can also put your Python in a Lisp: http://common-lisp.net/project/clpython/ http://common-lisp.net/project/clpython/
- adamc 16y agoInteresting. The name isn't the best to google for, though...
- metageek 16y agoTrue. It comes up as #2 and #3 if you google for "adder lisp", though.
- apgwoz 16y agoI have an unreleased/unfinished Scheme to Python interpreter, which is intended to be a full compiler. I'm using trampolining for everything as I wanna be able to support call/cc at some capacity, so there's a factor of slowdown to using it, but it's pretty fun nevertheless.