--- author: '' category: '' date: 2006/04/02 01:56 description: '' link: '' priority: '' slug: P347 tags: programming, python title: BPython Lives!!! type: text updated: 2006/04/02 01:56 url_type: '' --- In January, I suggested_ it would be trivial to write a preprocessor that would accept a version of python which delimited blocks with braces instead of indentation. Ok, almost, I suggested #{ and #} as delimiters. Well, I had a few minutes free today, and here it is, a functional BPython->Python compiler, so to speak. Here's the kind of imput it takes (notice how it's not indented at all:: def factorial(n): #{ if n==1: #{ return 1 #} else: #{ return n*factorial(n-1) #} #} for x in range(1,10): #{ print x,"!=",factorial(x) #} And it produces this (I am not happy with the indenting of the comments, but who cares): .. code-block:: Python def factorial(n): #{ if n==1: #{ return 1 #} else: #{ return n*factorial(n-1) #} #} for x in range(1,10): #{ print x,"!=",factorial(x) #} As you can see, this is both a legal Python and a legal BPython program ;-) It has some problems, like not working when you use a line like this:: #{ x=1 But hey, it *is* python with braces. Here's the code. I predicted 30 lines. It's 34. And it's 99% a ripoff of Ka Ping Yee's regurgitate.py which you can find all around the web. .. code-block:: Python #!/usr/bin/env python import tokenize, sys program = [] lastrow, lastcol = 1, 0 lastline = '' indlevel=0 def rebuild(type, token, (startrow, startcol), (endrow, endcol), line): global lastrow, lastcol, lastline, program,indlevel if type==52 and token.startswith ("#{"): type=5 indlevel+=1 if type==52 and token.startswith ("#}"): type=6 indlevel-=1 line=" "*indlevel+line.lstrip() startcol+=indlevel*2 endcol+=indlevel*2 # Deal with the bits between tokens. if lastrow == startrow == endrow: # ordinary token program.append(line[lastcol:startcol]) elif lastrow != startrow: # backslash continuation program.append(lastline[lastcol:] + line[:startcol]) elif startrow != endrow: # multi-line string program.append(lastline[lastcol:startcol]) # Append the token itself. program.append(token) # Save some information for the next time around. if token and token[-1] == '\n': lastrow, lastcol = endrow+1, 0 # start on next line else: lastrow, lastcol = endrow, endcol # remember last position lastline = line # remember last line tokenize.tokenize(sys.stdin.readline, rebuild) for piece in program: sys.stdout.write(piece) So, all of you who dislike python because of the lack of braces and the significant whitespace: BPython has no significant whitespace, and braces are mandatory. Enjoy coding! .. _suggested: //ralsina.me/lateral/weblog/2006/01/27.html#P343