On Wed, Sep 10, 2008 at 2:57 PM, Adam Olsen firstname.lastname@example.org wrote:
On Wed, Sep 10, 2008 at 3:18 PM, Cliff Wells email@example.com wrote:
Further, I feel that this limitation forces programmers into using hacks and magic or overly spread-out code, which itself leads to readability concerns. Having used Python for around a decade, I'm quite aware of the fact that you can happily write tons and tons of nice code with Python in its current state. However, because of the direction of my work (developing a internal DSL in Python) I've suddenly become aware of this glass ceiling. I'd bumped into it before back when I was doing a lot of GUI development, but blamed it on lambda rather than realizing that it wasn't lambda so much as what I am bringing up now.
Python is not intended for DSLs. Really, don't do it. Python is for python code. If you want another language, write your own parser. I hear lisp is simple to parse, and has no annoying statements to hold you back!
Seriously though, there is an advantage to basing so much on statements rather than expressions. We're specialized for one statement per line, which is the most common case, and it allowed us to have extraneous semicolons, braces, or whatever. Readability benefits, style consistency benefits.
Now there are some use cases that suffer here, including the one you just gave: defining a dispatch dict with the functions inline. The best I could do is define the dict first, then stick a decorator on each function to register them. That's still ugly though. A creative solution is needed, but none come to mind.
class dispatcher(dispatch_dictionary): def x(value): ... def y(value): ... def int_23(value): ... With the proper dispatch_dictionary base class and it's metaclass, dispatcher would become a dictionary with functions that map from strings and integers to function handlers.
Never underestimate the power of classes and metaclasses ;) .