extract thenFwdRewrite from code for paper
authorNorman Ramsey <nr@cs.tufts.edu>
Wed, 12 May 2010 21:04:24 +0000 (17:04 -0400)
committerNorman Ramsey <nr@cs.tufts.edu>
Wed, 12 May 2010 21:04:24 +0000 (17:04 -0400)
paper/dfopt.tex
paper/mkfile
src/Compiler/Hoopl/Combinators.hs

index a01a15c..1e866b4 100644 (file)
@@ -1552,22 +1552,9 @@ rewrite functions.
 For example, here is a function
 that combines two rewriting functions in sequence:
 \remark{This code must be improved}
-\begin{smallcode}
-  thenFwdRw :: Monad m 
-            => FwdRewrite m n f 
-            -> FwdRewrite m n f 
-            -> FwdRewrite m n f
-  `thenFwdRw rw1 rw2 = wrapFRewrites2' f rw1 rw2
-   where f rw1 rw2' n f = do
-           res1 <- rw1 n f
-           case res1 of
-             NoFwdRes      -> rw2' n f
-             FwdRes g rw1a -> 
-               return $ FwdRes g (rw1a `thenFwdRw` rw2)
-
-  `noFwdRw :: FwdRewrite n f
-  noFwdRw = mkFRewrite' $ \ n f -> NoFwdRes
-\end{smallcode}
+{\small
+\verbatiminput{comb1}
+}
 What a beautiful type @thenFwdRw@ has! It tries @rw1@, and if @rw1@
 declines to rewrite, it behaves like @rw2@.  But if
 @rw1@ rewrites, returning a new rewriter @rw1a@, then the overall call also
index f92645c..3ca6e73 100644 (file)
@@ -21,7 +21,7 @@ tag:VQ: $TGT.tex
        echo git tag $tag
        git tag $tag
 
-dfopt.dvi: dfopt.bbl code.sty timestamp.tex dfoptdu.tex cprop.tex
+dfopt.dvi: dfopt.bbl code.sty timestamp.tex dfoptdu.tex cprop.tex comb1.tex
 
 $TGT.pdf: $TGT.dvi
        dvips -Ppdf -o"|ps2pdf - $target" -pp 1-$LASTPAGE $prereq
@@ -56,3 +56,8 @@ CPROPS=ConstProp Simplify Test
 
 cprop.tex:D: ./xsource ${CPROPS:%=$CLIENT/%.hs}
        lua $prereq > $target
+
+HOOPL=../src/Compiler/Hoopl
+
+comb1.tex:D: ./xsource $HOOPL/Combinators.hs
+       lua $prereq > $target
index 8707be6..2920eea 100644 (file)
@@ -53,8 +53,8 @@ wrapSFRewrite3 lift rw = uncurry3 mkFRewrite3 $ apply lift rw
 wrapFRewrite3 :: ExTriple (MapFRW m n f) -> FR m n f -> FR m n f
 wrapFRewrite3 map frw = uncurry3 mkFRewrite3 $ apply map $ getFRewrite3 frw
 
-wrapFRewrites2 :: ExTriple (MapFRW2 m n f) -> FR m n f -> FR m n f -> FR m n f
-wrapFRewrites2 map frw1 frw2 =
+wrapFRewrites23 :: ExTriple (MapFRW2 m n f) -> FR m n f -> FR m n f -> FR m n f
+wrapFRewrites23 map frw1 frw2 =
   uncurry3 mkFRewrite3 $ (applyBinary map `on` getFRewrite3) frw1 frw2
 
 
@@ -69,13 +69,11 @@ wrapFRewrites' map = wrapFRewrite3 (map, map, map)
 -- Would be nice to refactor here XXX  ---NR
 
 
-wrapFRewrites2' :: (forall e x . MapFRW2 m n f e x) -> FR m n f -> FR m n f -> FR m n f
-wrapFRewrites2' map = wrapFRewrites2 (map, map, map)
+wrapFRewrites2 :: (forall e x . MapFRW2 m n f e x) -> FR m n f -> FR m n f -> FR m n f
+wrapFRewrites2 map = wrapFRewrites23 (map, map, map)
 
 ----------------------------------------------------------------
 
-noFwdRewrite :: Monad m => FwdRewrite m n f
-noFwdRewrite = mkFRewrite $ \ _ _ -> return NoFwdRes
 
 shallowFwdRw3 :: forall m n f . Monad m => SimpleFwdRewrite3 m n f -> FwdRewrite m n f
 shallowFwdRw3 rw = wrapSFRewrites' lift rw
@@ -91,13 +89,24 @@ deepFwdRw :: Monad m => SimpleFwdRewrite m n f -> FwdRewrite m n f
 deepFwdRw3    r = iterFwdRw (shallowFwdRw3 r)
 deepFwdRw f = deepFwdRw3 (f, f, f)
 
-thenFwdRw :: Monad m => FwdRewrite m n f -> FwdRewrite m n f -> FwdRewrite m n f
-thenFwdRw rw1 rw2 = wrapFRewrites2' tfr rw1 rw2
-  where tfr rw1 rw2' n f = do  -- Gross!! Isn't rw2 == rw2' always? XXX ---NR
-          res1 <- rw1 n f
-          case res1 of
-            NoFwdRes        -> rw2' n f
-            (FwdRes g rw1a) -> return $ FwdRes g (rw1a `thenFwdRw` rw2)
+-- N.B. rw3, rw3', and rw3a are triples of functions.
+-- But rw and rw' are single functions.
+-- @ start comb1.tex
+thenFwdRw :: Monad m 
+          => FwdRewrite m n f 
+          -> FwdRewrite m n f 
+          -> FwdRewrite m n f
+thenFwdRw rw3 rw3' = wrapFRewrites2 tfr rw3 rw3'
+ where tfr rw rw' n f = do
+         res1 <- rw n f
+         case res1 of
+           NoFwdRes      -> rw' n f
+           FwdRes g rw3a -> 
+             return $ FwdRes g (rw3a `thenFwdRw` rw3')
+
+noFwdRewrite :: Monad m => FwdRewrite m n f
+noFwdRewrite = mkFRewrite $ \ _ _ -> return NoFwdRes
+-- @ end comb1.tex
 
 iterFwdRw :: Monad m => FwdRewrite m n f -> FwdRewrite m n f
 iterFwdRw rw = wrapFRewrites' f rw