Tuesday, January 29, 2008

Stackless RPython - Recursive

Got input from pypy/rpython developers, and in order to get stackless rpython it was just to add parameter stackless=True and replace parameter gc='ref' with gc='generation' to Translation() method.
`# The Computer Language Shootout# http://shootout.alioth.debian.org/# based on bearophile's psyco program# slightly modified by Isaac Gouy# And adapted to RPython by Amunddef Ack(x, y):    if x == 0: return y+1    if y == 0: return Ack(x-1, 1)    return Ack(x-1, Ack(x, y-1))def Fib(n):    if n < 2: return 1    return Fib(n-2) + Fib(n-1)def FibFP(n):    if n < 2.0: return 1.0    return FibFP(n-2.0) + FibFP(n-1.0)def Tak(x, y, z):    if y < x:  return Tak(   Tak(x-1,y,z),   Tak(y-1,z,x),   Tak(z-1,x,y) )    return zdef TakFP(x, y, z):    if y < x:  return TakFP(  TakFP(x-1.0,y,z),  TakFP(y-1.0,z,x),   TakFP(z-1.0,x,y) )    return z# RPython stuff starts herefrom sys import argv #, setrecursionlimit#setrecursionlimit(12345678901)def main(argv):    n = int(argv[1]) - 1    print "Ack(3,%d):" % (n+1), Ack(3, n+1)    print "Fib(" + str(28.0+n) + "," + str(FibFP(28.0+n))    print "Tak(%d,%d,%d): %d" % (3*n, 2*n, n, Tak(3*n, 2*n, n))    print "Fib(3):", Fib(3)    print "Tak(3.0,2.0,1.0):", TakFP(3.0, 2.0, 1.0)    return 0from pypy.translator.interactive import Translation#t = Translation(main, standalone=True, gc='ref')t = Translation(main, standalone=True,  stackless=True, gc='generation')t.source(backend='c')path = t.compile()print path`