3 ms·
I implemented a network-sort function generator, but the limited lambdas of Python seem to force me to make the macro declare a real function with magic name (s
by iso8859-1 13y ago
I implemented a network-sort function generator, but the limited lambdas of Python seem to force me to make the macro declare a real function with magic name (see below). Also, I didn't figure out how to use the walker or quasiquotes, so I'm just generating source code and taking the AST of that.
#run.py
import macropy.core.macros
import target
#batcher.py
# http://en.wikipedia.org/wiki/Batcher_odd%E2%80%93even_mergesort
def oddeven_merge(lo, hi, r):
step = r * 2
if step < hi - lo:
for x in oddeven_merge(lo, hi, step): yield x
for x in oddeven_merge(lo + r, hi, step): yield x
for i in range(lo + r, hi - r, step): yield (i, i+r)
else:
yield (lo, lo + r)
def oddeven_merge_sort_range(lo, hi):
if (hi - lo) >= 1:
mid = lo + ((hi - lo) // 2)
for x in oddeven_merge_sort_range(lo, mid): yield x
for x in oddeven_merge_sort_range(mid + 1, hi): yield x
for x in oddeven_merge(lo, hi, 1): yield x
def oddeven_merge_sort(n):
return list(oddeven_merge_sort_range(0, n-1))
#target.py
from macro_module import macros, my_expr_macro
import dis
my_expr_macro%(8)
print dis.dis(fun8)
print fun8([2, 4, 3, 5, 6, 1, 7, 8])
#macro_module.py
from macropy.core.macros import Macros
from macropy.core import *
from ast import *
macros = Macros()
import macropy.macros
from batcher import oddeven_merge_sort
@macros.expr
def my_expr_macro(tree):
return parse_stmt("def fun" + str(tree.n) + "(a):\n" +
"\n".join([" if a[{0}] > a[{1}]: tmp = a[{0}]; a[{0}] = a[{1}]; a[{1}] = tmp".format(x,y) for (x,y) in oddeven_merge_sort(tree.n)]) +
"\n return a")
When running, it will spit out the Python bytecode disassembly to show the unrolled sorting loop.