[add mapExpLam, use it, make mapExpExp update funcdef properties, mapExpVal should map the scrutinee of a case
John Meacham <john@repetae.net>**20070608035625] hunk ./Grin/Noodle.hs 51
+    f (Case v as) = do
+        v <- g v
+        return (Case v as)
hunk ./Grin/Noodle.hs 63
-mapExpExp f (a :>>= v :-> b) = do
-    a <- f a
-    b <- f b
-    return (a :>>= v :-> b)
-mapExpExp f (Case e as) = do
-    as' <- mapM (mapBodyM f) as
-    return (Case e as')
-mapExpExp f l@Let { expBody = b, expDefs = defs } = do
-    b <- f b
-    defs' <- mapFBodies f defs
-    return $ updateLetProps l { expBody = b, expDefs = defs' }
-mapExpExp _ x = return x
+mapExpLam fn e = f e where
+    f (a :>>= b) = return (a :>>=) `ap` fn b
+    f (Case e as) = return (Case e) `ap` mapM fn as
+    f lt@Let { expDefs = defs } = do
+        defs' <- forM defs $ \d -> do
+            b <- fn $ funcDefBody d
+            return $ updateFuncDefProps d { funcDefBody = b }
+        return $ updateLetProps lt { expDefs = defs' }
+    f nr@NewRegion { expLam = lam } = do
+        lam <- fn lam
+        return $ nr { expLam = lam }
+    f e@MkCont { expCont = c, expLam = l } = do
+        c <- fn c
+        l <- fn l
+        return $ e { expCont = c, expLam = l }
+    f e = return e
+
+
+
+mapExpExp fn e = f e where
+    f (a :>>= b) = return (:>>=) `ap` fn a `ap` g b
+    f l@Let { expBody = b, expDefs = defs } = do
+        b <- fn b
+        mapExpLam g l { expBody = b }
+    f e = mapExpLam g e
+    g (l :-> e) = return (l :->) `ap` fn e