tinypy: did i mention metaprogramming?
For the sake of this post, I’m going to pretend to know what metaprogramming* is. Yeah, so tinypy** totally has that. At least, since the parser and compiler in tinypy is written in tinypy, you are able to modify those modules on-the-fly and add new features into the tinypy language. (Not that you’d want to, but certain other languages get so uppity about being able to do that, I figured I’d plug for tinypy here.)
For example, (at present) tinypy doesn’t have support for decorators. I’ve always liked decorators, so I made this code (a zip of main.py, deco.py***, and test.py) so that if you have a main.py:
import deco
import test
When the deco module is loaded, it cleanly**** adds decorator support into the tokenize, parse, and encode modules of tinypy. Then when the test module is loaded, it is able to use decorator syntax. Yay! This mostly thanks to the top down operator precedence implementation in tinypy.
So now, if say, you have some crazy idea for how the $ operator should be used in bigpy, you can go ahead and use metaprogramming to add it into tinypy and show all your friends how awful your new syntax looks and have a working proof-of-concept! Yay!
* feel free to enlighten me
** it’s got a mailing list now, join in on all the fun!!
*** only 611 bytes :)Â They were pretty simple to implement, since they really just mean: “given ‘@a \n def b …’ do ‘def b … \n b=a(b)'”
**** Since all the language features are stored in dictionaries, it’s “pretty easy” to add new symbols / operators. (Or remove features, or whatever!)
April 22nd, 2008 at 4:00 am
Ooh, nice. It’s always annoyed me that Python doesn’t have an until-statement, and that I can’t add one without changing the c-code. Not that I’m actually going to start using TinyPy just because of this, but it’s still nice. 🙂
April 22nd, 2008 at 4:23 am
One problem is, IMO the word “meta” programming. To me it implies that there is so much magic involved that not even the programmer knows whats going on anymore
April 22nd, 2008 at 6:33 am
Man that is cool
April 22nd, 2008 at 9:32 am
“Until you read ‘the art of the meta object protocol’, implemented the actuator, and have taught it to someone else, you do not know what meta-programming is. That said, once you do that, please explain it to me.” -Quote from prolog users mailing list.
That is from my quotes.txt file that I have been building for the past 15 years. 😉
@Lennart:
As for the until statement, you can create that extension quite easily in python, it just looks weird:
@until(lambda x: x==4)
def loop():
do some work
return vars_to_be_tested
Also there are better logic constructs that you can do with the ‘with’ statement as well. I feel that is a better meme than the until statement as it supports error handling and cleanup in a much more sane manner. @contextmanager rocks!
To quote Tim Peters from 2000:
To summarize 10 years of fruitless discussion on this issue: yes,
while 1:
…
if finished:
break
is the intended way to spell “do … until” in Python.
“do … until F” is better than “do … while F” because the truth of F
conjoined with the loop invariant and loop precondition should imply the
loop postcondition, and the “while” form artificially negates the F of
interest, thus making reasoning harder.
“do … while F” is better than “do … until F” because the truth of F
conjoined with the loop invariant and loop precondition should imply that
the loop invariant still holds, and the “until” form artificially negates
the F of interest, thus making reasoning harder.
Python’s indentation rules do indeed not fit well with either form. If
there were an obvious way to make them fit well, Guido would have done so a long time ago. In the meantime, if you think you see one, write a PEP!
and-no-of-course-uninitialized-vrbls-exist-in-python-ly y’rs – tim
April 22nd, 2008 at 9:46 am
actually a do.. until can be done relatively easily, if you allow a “until cond” statements anywhere in the block and treat them as “if cond: break”
better yet, just have a “do:” statement which is an infinite loop and break out of it with “if cond: break”
do:
stmt
stmt
until x > 1
stmt
until othercond
April 22nd, 2008 at 9:57 am
@nevinera replying to she: “you clearly only know languages in which it is difficult then.”
I think in the case of tinypy, I’d categorize my “adding decorators by an import” as “hard enough that I had to think” but not so hard that it took me more than half an hour.
April 22nd, 2008 at 11:08 am
@Doug
I feel enlightened. Sort of.
April 23rd, 2008 at 9:47 am
Awesome. ‘$’ should be short for ‘self.’ similar to how ‘?’ was short for ‘print’ in basic.
April 30th, 2008 at 3:39 pm
I have to admit that I didn’t understand any of the answers. 🙂
I don’t want a do until btw. Because that doesn’t work with the indentation in a reasonable way. I just want an until.
until x:
do something
Would work like “while x” except that it would always loop once.