[make Grin -> C conversion a bit smarter about assigning tuples to variables
John Meacham <john@repetae.net>**20070522041737] hunk ./C/FromGrin2.hs 30
+import Support.Tuple
hunk ./C/FromGrin2.hs 212
-        localJumps xs = local (rEMap_u (Map.fromList xs `mappend`))
+    let localJumps xs = local (rEMap_u (Map.fromList xs `mappend`))
hunk ./C/FromGrin2.hs 224
-convertBody (e :>>= Tup xs :-> e') = do
-    ts <- mapM ( convertType . getType) xs
-    st <- newVar (anonStructType ts)
-    ss <- localTodo (TodoExp [st]) (convertBody e)
-    ss' <- convertBody e'
-    vs <- mapM convertVal xs
-    return $  ss & mconcat [ v =* projectAnon i st | v <- vs | i <- [0..] ] & ss'
hunk ./C/FromGrin2.hs 342
+convertBody (e :>>= Tup xs :-> e') = do
+    ts <- mapM (convertType . getType) xs
+    st <- newVar (anonStructType ts)
+    ss <- localTodo (TodoExp [st]) (convertBody e)
+    ss' <- convertBody e'
+    vs <- mapM convertVal xs
+    return $  ss & mconcat [ v =* projectAnon i st | v <- vs | i <- [0..] ] & ss'
+
hunk ./C/FromGrin2.hs 377
+
+convertBody (Return (Tup xs)) = do
+    t <- asks rTodo
+    case t of
+        TodoExp [e] -> do
+            xs <- mapM convertVal xs
+            ss <- forMn xs $ \ (v,i) -> return (projectAnon i e =* v)
+            return (mconcat ss)
+        _ -> simpleRet =<< convertVal (Tup xs)
hunk ./C/FromGrin2.hs 418
---isCompound App {} = False
---isCompound Call {} = False