about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2014-11-27 01:07:28 -0800
committerKartik K. Agaram <vc@akkartik.com>2014-11-27 01:10:30 -0800
commita069fd623df37f29cc97cca74b1fe74abfc658de (patch)
tree2dd76c47e778e55029924daf526f87a4c4eb973f
parent6fbdc6c853631108720b4928c6e21e057d93081a (diff)
downloadmu-a069fd623df37f29cc97cca74b1fe74abfc658de.tar.gz
343 - experiment: rewrite rules
We'll worry later about implementing them in mu.
-rw-r--r--mu.arc19
-rw-r--r--mu.arc.t21
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