A categorical programming language
修订版 | 1afe5549ea065f418310c47a71c3b222a30945a2 (tree) |
---|---|
时间 | 2021-11-14 05:52:34 |
作者 | Corbin <cds@corb...> |
Commiter | Corbin |
cammy-run: Multiple JIT drivers.
@@ -200,6 +200,10 @@ class Succ(Arrow): | ||
200 | 200 | _immutable_ = True |
201 | 201 | def run(self, x): return N(x.n().int_add(1)) |
202 | 202 | |
203 | +pr_driver = JitDriver(name="pr", | |
204 | + greens=["pr"], reds=["n", "rv"], | |
205 | + is_recursive=True) | |
206 | + | |
203 | 207 | class PrimRec(Arrow): |
204 | 208 | _immutable_ = True |
205 | 209 | def __init__(self, x, f): |
@@ -210,6 +214,7 @@ class PrimRec(Arrow): | ||
210 | 214 | n = x.n() |
211 | 215 | rv = self._x.run(T()) |
212 | 216 | while n.tobool(): |
217 | + pr_driver.jit_merge_point(pr=self, n=n, rv=rv) | |
213 | 218 | n = n.int_sub(1) |
214 | 219 | rv = self._f.run(rv) |
215 | 220 | return rv |
@@ -222,6 +227,14 @@ class Cons(Arrow): | ||
222 | 227 | _immutable_ = True |
223 | 228 | def run(self, x): return Xs([x.first()] + x.second().l()) |
224 | 229 | |
230 | +fold_driver = JitDriver(name="fold", | |
231 | + greens=["fold"], reds=["element"], | |
232 | + is_recursive=True) | |
233 | + | |
234 | +def driveFold(fold, element): | |
235 | + fold_driver.jit_merge_point(fold=fold, element=element) | |
236 | + return fold.run(element) | |
237 | + | |
225 | 238 | class Fold(Arrow): |
226 | 239 | _immutable_ = True |
227 | 240 | def __init__(self, n, c): |
@@ -230,7 +243,7 @@ class Fold(Arrow): | ||
230 | 243 | def run(self, x): |
231 | 244 | rv = self._n.run(T()) |
232 | 245 | for e in x.l(): |
233 | - rv = self._c.run(P(e, rv)) | |
246 | + rv = driveFold(self._c, P(e, rv)) | |
234 | 247 | return rv |
235 | 248 | |
236 | 249 | class FZero(Arrow): |
@@ -465,11 +478,12 @@ class Window(object): | ||
465 | 478 | c2 = scale(self._corners[1], self._corners[3], dh + ih * h) |
466 | 479 | return c1, c2 |
467 | 480 | |
468 | -driver = JitDriver(greens=["program"], | |
469 | - reds=["x", "y"]) | |
481 | +sample_driver = JitDriver(name="sample", | |
482 | + greens=["program"], reds=["x", "y"], | |
483 | + is_recursive=True) | |
470 | 484 | |
471 | 485 | def sample(program, x, y): |
472 | - driver.jit_merge_point(program=program, x=x, y=y) | |
486 | + sample_driver.jit_merge_point(program=program, x=x, y=y) | |
473 | 487 | rgb = program.run(P(F(x), F(y))) |
474 | 488 | r = rgb.first().f() |
475 | 489 | g = rgb.second().first().f() |
@@ -508,7 +522,7 @@ def drawPNG(program, filename, corners, width, height): | ||
508 | 522 | |
509 | 523 | |
510 | 524 | def main(argv): |
511 | - set_param(driver, "trace_limit", 50001) | |
525 | + set_param(None, "trace_limit", 50001) | |
512 | 526 | |
513 | 527 | prog = argv[1] |
514 | 528 | window = [string_to_float(s) for s in split(argv[2])] |