diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2014-11-27 01:07:28 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2014-11-27 01:10:30 -0800 |
commit | a069fd623df37f29cc97cca74b1fe74abfc658de (patch) | |
tree | 2dd76c47e778e55029924daf526f87a4c4eb973f | |
parent | 6fbdc6c853631108720b4928c6e21e057d93081a (diff) | |
download | mu-a069fd623df37f29cc97cca74b1fe74abfc658de.tar.gz |
343 - experiment: rewrite rules
We'll worry later about implementing them in mu.
-rw-r--r-- | mu.arc | 19 | ||||
-rw-r--r-- | mu.arc.t | 21 |
2 files changed, 38 insertions, 2 deletions
diff --git a/mu.arc b/mu.arc index 2884ffdd..757db53e 100644 --- a/mu.arc +++ b/mu.arc @@ -84,7 +84,8 @@ (def clear () (= types* (table)) (= memory* (table)) - (= function* (table))) + (= function* (table)) + (= rewrite-rules* (table))) (enq clear initialization-fns*) (on-init @@ -1129,6 +1130,7 @@ (def add-code (forms) (each (op . rest) forms +;? (tr op " " rewrite-rules*.op) (case op ; syntax: def <name> [ <instructions> ] ; don't apply our lightweight tools just yet @@ -1158,7 +1160,20 @@ after (let (label (_make-br-fn fragment)) rest (assert (is 'make-br-fn _make-br-fn)) - (push fragment after*.label))))) + (push fragment after*.label)) + + rewrite + (let (name (_make-br-fn fragment)) rest + (assert (is 'make-br-fn _make-br-fn)) + (= rewrite-rules*.name fragment)) + + ;else ; must be rewriteable to one of the above + (let new-form (rewrite rewrite-rules*.op rest) + (add-code new-form)) + ))) + +(def rewrite (rewrite-rule params) + rewrite-rule) (def freeze-functions () (each (name body) canon.function* diff --git a/mu.arc.t b/mu.arc.t index 485c2634..77909607 100644 --- a/mu.arc.t +++ b/mu.arc.t @@ -2976,4 +2976,25 @@ (if (~memory-contains memory*.3 "hello, world!") (prn "F - 'strcat' concatenates strings")) +; defining rewrite rules +(reset) +(new-trace "new-rewrite-rule") +(= traces* (queue)) +(add-code '((rewrite foo [ + (def bar [ + ((1 integer) <- copy (0 literal)) + ]) + ]))) +;? (prn rewrite-rules*) +(if (~iso rewrite-rules*!foo '((def bar [((1 integer) <- copy (0 literal))]))) + (prn "F - 'rewrite' defines rewrite rules")) + +(= function* (table)) +(add-code '((foo))) +;? (prn function*) +(if (~iso function*!bar + '( + ((1 integer) <- copy (0 literal)))) + (prn "F - simple rewrite-rule correctly expanded")) + (reset) ; end file with this to persist the trace for the final test |