packages feed

syntactic 1.6.1 → 1.7.1

raw patch · 23 files changed

+441/−232 lines, 23 filesdep +template-haskelldep ~base

Dependencies added: template-haskell

Dependency ranges changed: base

Files

CONTRIBUTORS view
@@ -1,3 +1,5 @@ The following people have contributed to Syntactic:    * Anders Persson+  * Daniel Schoepe+  * Dmytro Lypai
examples/NanoFeldspar/Core.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-}@@ -69,10 +70,8 @@         , semanticEval = \len ixf -> map ixf [0 .. len-1]         } -instance Equality Parallel where equal = equalDefault; exprHash = exprHashDefault-instance Render   Parallel where renderArgs = renderArgsDefault-instance Eval     Parallel where evaluate   = evaluateDefault-instance ToTree   Parallel+semanticInstances ''Parallel+ instance EvalBind Parallel where evalBindSym = evalBindSymDefault  instance AlphaEq dom dom dom env => AlphaEq Parallel Parallel dom env@@ -102,10 +101,8 @@         , semanticEval = \len init body -> foldl (flip body) init [0 .. len-1]         } -instance Equality ForLoop where equal = equalDefault; exprHash = exprHashDefault-instance Render   ForLoop where renderArgs = renderArgsDefault-instance Eval     ForLoop where evaluate   = evaluateDefault-instance ToTree   ForLoop+semanticInstances ''ForLoop+ instance EvalBind ForLoop where evalBindSym = evalBindSymDefault  instance AlphaEq dom dom dom env => AlphaEq ForLoop ForLoop dom env@@ -152,8 +149,13 @@ canShare (prj -> Just (Literal _)) = Nothing canShare _  = Just Dict +canShareIn :: ASTF (FODomain FeldSyms Typeable Top) a -> Bool+canShareIn (lam :$ _)+    | Just _ <- prjP (P::P (CLambda Top)) lam = False+canShareIn _ = True+ canShareDict :: MkInjDict (FODomain FeldSyms Typeable Top)-canShareDict = mkInjDictFO canShare+canShareDict = mkInjDictFO canShare canShareIn   
examples/NanoFeldspar/Extra.hs view
@@ -8,6 +8,7 @@   +import Control.Monad.State import Data.Typeable  import Language.Syntactic as Syntactic@@ -16,6 +17,7 @@ import Language.Syntactic.Constructs.Binding.Optimize import Language.Syntactic.Constructs.Construct import Language.Syntactic.Constructs.Literal+import Language.Syntactic.Sharing.SimpleCodeMotion import Language.Syntactic.Sharing.Graph import Language.Syntactic.Sharing.ReifyHO @@ -57,7 +59,7 @@   ----------------------------------------------------------------------------------- * Partial evaluation+-- * Simplification/constant folding --------------------------------------------------------------------------------  instance Optimize ForLoop@@ -77,6 +79,15 @@       _ -> expr     ) expr -drawPart :: (Syntactic a, Domain a ~ FeldDomainAll) => a -> IO ()-drawPart = Syntactic.drawAST . optimize constFold . reify+reifySimp :: (Syntactic a, Domain a ~ FeldDomainAll) =>+    a -> ASTF ((FODomain (Let :+: (FeldDomain :|| Eq :| Show))) Typeable Top) (Internal a)+reifySimp = flip evalState 0 .+    (   codeMotion prjDictFO canShareDict+    .   optimize constFold+    <=< reifyM+    .   desugar+    )++drawSimp :: (Syntactic a, Domain a ~ FeldDomainAll) => a -> IO ()+drawSimp = Syntactic.drawAST . reifySimp 
examples/NanoFeldspar/Test.hs view
@@ -11,36 +11,49 @@   ----------------------------------------------------------------------------------- Basic operations+-- Basic examples -------------------------------------------------------------------------------- --- Parallel arrays-prog1 :: Data Int -> Data Int -> Data [Int]-prog1 a b = parallel a (\i -> min (i+3) b)+-- Scalar product+scProd :: Vector (Data Float) -> Vector (Data Float) -> Data Float+scProd a b = sum (zipWith (*) a b) --- Evaluation-test1_1 = eval prog1 10 20+forEach = flip map --- Print the expression-test1_2 = printExpr prog1+-- Matrix multiplication+matMul :: Matrix Float -> Matrix Float -> Matrix Float+matMul a b = forEach a $ \a' ->+               forEach (transpose b) $ \b' ->+                 scProd a' b' --- Render the syntax tree-test1_3 = drawAST prog1+-- Note that+--+--   * `transpose` is fused with `scProd`+--   * some invariant expressions have been hoisted out of `parallel` and `forLoop` (see the+--     `Let` nodes)+test_matMul = drawAST matMul +-- Parallel array+prog1 :: Data Int -> Data Int -> Data [Int]+prog1 a b = parallel a (\i -> min (i+3) b)+ -- Common sub-expressions prog2 :: Data Int -> Data Int prog2 a = max (min a a) (min a a) --- Basic vector operations prog3 :: Data Index -> Data Index -> Data Index prog3 a b = sum $ reverse (l ... u)   where     l = min a b     u = max a b +-- Invariant code hoisting+prog4 :: Data Int -> Data [Int]+prog4 a = parallel a (\i -> (a+a)*i)+ -- Explicit sharing-prog4 :: Data Index -> Data Index-prog4 a = share (a*2,a*3) $ \(b,c) -> (b-c)*(c-b)+prog5 :: Data Index -> Data Index+prog5 a = share (a*2,a*3) $ \(b,c) -> (b-c)*(c-b)   @@ -48,17 +61,17 @@ -- Common sub-expression elimination and observable sharing -------------------------------------------------------------------------------- -prog5 = index as 1 + sum as + sum as+prog6 = index as 1 + sum as + sum as   where     as = map (*2) $ force (1...20) -test5_1 = drawAST prog5+test6_1 = drawAST prog6   -- Draws a tree with no duplication -test5_2 = drawCSE prog5+test6_2 = drawCSE prog6   -- Draws a graph with no duplication -test5_3 = drawObs prog5+test6_3 = drawObs prog6   -- Draws a graph with some duplication. The 'forLoop' introduced by 'sum' is   -- not shared, because 'sum as' is repeated twice in source code. But the   -- 'parallel' introduced by 'force' is shared, because 'force' only appears@@ -70,16 +83,16 @@ -- Optimizations -------------------------------------------------------------------------------- -prog6 :: Data Int -> Data Int-prog6 a = (a==10) ? (max 5 (6+7), max 5 (6+7))+prog7 :: Data Int -> Data Int+prog7 a = (a==10) ? (max 5 (6+7), max 5 (6+7)) -test6 = drawPart prog6+test7 = drawSimp prog7   -- Reduced to the literal 13 -prog7 a = c ? (parallel 10 (+a), parallel 10 (+a))+prog8 a = c ? (parallel 10 (+a), parallel 10 (+a))   where     c = (a*a*a*a) == 23 -test7 = drawPart prog7+test8 = drawSimp prog8   -- The condition gets pruned away 
examples/NanoFeldspar/Vector.hs view
@@ -49,6 +49,11 @@ index :: Vector a -> Data Index -> a index (Indexed _ ixf) = ixf +(!) :: Vector a -> Data Index -> a+Indexed _ ixf ! i = ixf i++infixl 9 !+ freezeVector :: Type a => Vector (Data a) -> Data [a] freezeVector vec = parallel (length vec) (index vec) @@ -83,6 +88,12 @@ fold :: Syntax b => (a -> b -> b) -> b -> Vector a -> b fold f b (Indexed len ixf) = forLoop len b (\i st -> f (ixf i) st) -sum :: (Type a, Num a) => Vector (Data a) -> Data a+sum :: (Num a, Syntax a) => Vector a -> a sum = fold (+) 0++type Matrix a = Vector (Vector (Data a))++-- | Transpose of a matrix. Assumes that the number of rows is > 0.+transpose :: Type a => Matrix a -> Matrix a+transpose a = indexed (length (a!0)) $ \k -> indexed (length a) $ \l -> a ! l ! k 
src/Language/Syntactic/Constructs/Binding/HigherOrder.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE UndecidableInstances #-}  -- | This module provides binding constructs using higher-order syntax and a
src/Language/Syntactic/Constructs/Condition.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE TemplateHaskell #-}+ -- | Conditional expressions  module Language.Syntactic.Constructs.Condition where@@ -21,8 +23,5 @@   where     semantics Condition = Sem "condition" (\c t e -> if c then t else e) -instance Equality Condition where equal = equalDefault; exprHash = exprHashDefault-instance Render   Condition where renderArgs = renderArgsDefault-instance Eval     Condition where evaluate   = evaluateDefault-instance ToTree   Condition+semanticInstances ''Condition 
src/Language/Syntactic/Constructs/Construct.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE TemplateHaskell #-}+ -- | Provides a simple way to make syntactic constructs for prototyping. Note -- that 'Construct' is quite unsafe as it only uses 'String' to distinguish -- between different constructs. Also, 'Construct' has a very free type that@@ -24,8 +26,5 @@   where     semantics (Construct name den) = Sem name den -instance Equality Construct where equal = equalDefault; exprHash = exprHashDefault-instance Render   Construct where renderArgs = renderArgsDefault-instance Eval     Construct where evaluate   = evaluateDefault-instance ToTree   Construct+semanticInstances ''Construct 
src/Language/Syntactic/Constructs/Identity.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE TemplateHaskell #-}+ -- | Identity function  module Language.Syntactic.Constructs.Identity where@@ -22,8 +24,5 @@   where     semantics Id = Sem "id" id -instance Equality Identity where equal = equalDefault; exprHash = exprHashDefault-instance Render   Identity where renderArgs = renderArgsDefault-instance Eval     Identity where evaluate   = evaluateDefault-instance ToTree   Identity+semanticInstances ''Identity 
src/Language/Syntactic/Constructs/Tuple.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE TemplateHaskell #-}+ -- | Construction and elimination of tuples in the object language  module Language.Syntactic.Constructs.Tuple where@@ -38,10 +40,7 @@     semantics Tup6 = Sem "tup6" (,,,,,)     semantics Tup7 = Sem "tup7" (,,,,,,) -instance Equality Tuple where equal = equalDefault; exprHash = exprHashDefault-instance Render   Tuple where renderArgs = renderArgsDefault-instance Eval     Tuple where evaluate   = evaluateDefault-instance ToTree   Tuple+semanticInstances ''Tuple   @@ -120,10 +119,7 @@     semantics Sel6 = Sem "sel6" sel6     semantics Sel7 = Sem "sel7" sel7 -instance Equality Select where equal = equalDefault; exprHash = exprHashDefault-instance Render   Select where renderArgs = renderArgsDefault-instance Eval     Select where evaluate   = evaluateDefault-instance ToTree   Select+semanticInstances ''Select  -- | Return the selected position, e.g. --
src/Language/Syntactic/Interpretation/Semantics.hs view
@@ -1,9 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}+ -- | Default implementations of some interpretation functions  module Language.Syntactic.Interpretation.Semantics where   +import Language.Haskell.TH+import Language.Haskell.TH.Quote+ import Data.Hash  import Language.Syntactic.Syntax@@ -74,3 +79,13 @@ evaluateDefault :: Semantic expr => expr a -> Denotation a evaluateDefault = evaluate . semantics +semanticInstances :: Name -> DecsQ+semanticInstances n =+    [d|+        instance Equality $(typ) where equal = equalDefault ; exprHash = exprHashDefault+        instance Render $(typ) where renderArgs = renderArgsDefault+        instance ToTree $(typ)+        instance Eval $(typ) where evaluate = evaluateDefault+    |]+  where+    typ = conT n
src/Language/Syntactic/Sharing/SimpleCodeMotion.hs view
@@ -211,11 +211,13 @@ -- witness that the type of the expression satisfies the predicate @pVar@. mkInjDictFO :: forall dom pVar . (Let :<: dom)     => (forall a . ASTF (FODomain dom Typeable pVar) a -> Maybe (Dict (pVar a)))+    -> (forall b . ASTF (FODomain dom Typeable pVar) b -> Bool)     -> MkInjDict (FODomain dom Typeable pVar)-mkInjDictFO canShare a b+mkInjDictFO canShare canShareIn a b     | Dict <- exprDict a     , Dict <- exprDict b     , Just Dict <- canShare a+    , canShareIn b     = Just $ InjDict         { injVariable = \v -> injC (symType pVar $ C' (Variable v))         , injLambda   = \v -> injC (symType pLam $ SubConstr2 (Lambda v))@@ -224,5 +226,5 @@   where     pVar = P::P (Variable :|| pVar)     pLam = P::P (CLambda pVar)-mkInjDictFO _ _ _ = Nothing+mkInjDictFO _ _ _ _ = Nothing 
syntactic.cabal view
@@ -1,5 +1,5 @@ Name:           syntactic-Version:        1.6.1+Version:        1.7.1 Synopsis:       Generic abstract syntax, and utilities for embedded languages Description:    This library provides:                 .@@ -99,12 +99,13 @@    build-depends:     array,-    base >= 4 && < 4.7,+    base >= 4 && < 4.8,     containers,     constraints,     data-hash,     ghc-prim,     mtl >= 2 && < 3,+    template-haskell,     transformers >= 0.2,     tuple >= 0.2 @@ -160,7 +161,8 @@    build-depends:     syntactic,-    base >= 4 && < 4.7,+    base,+    mtl >= 2 && < 3,     QuickCheck >= 2.4 && < 3,     test-framework >= 0.6,     test-framework-th >= 0.2,@@ -193,8 +195,9 @@    build-depends:     syntactic,-    base >= 4 && < 4.7,+    base,     bytestring,+    mtl >= 2 && < 3,     test-framework >= 0.6,     test-framework-golden >= 1.1 
tests/NanoFeldsparEval.hs view
@@ -9,10 +9,16 @@   +prop_scProd a b = eval scProd a' b' == ref a' b'+  where+    a' = take 20 a+    b' = take 20 b+    ref a b = sum (zipWith (*) a b)+ prop_1 a b = eval prog1 a' b == ref a' b   where     a' = a `mod` 20-    ref a b = [min (i+3) b | i <- [0..a'-1]]+    ref a b = [min (i+3) b | i <- [0..a-1]]  prop_2 a = eval prog2 a == ref a   where@@ -26,17 +32,22 @@         l = min a b         u = max a b -prop_4 a = eval prog4 a == ref a+prop_4 a = eval prog4 a' == ref a'   where+    a' = a `mod` 20+    ref a = [(a+a)*i | i <- [0..a-1]]++prop_5 a = eval prog5 a == ref a+  where     ref a = let (b,c) = (a*2,a*3) in (b-c)*(c-b) -prop_5 = eval prog5 == ref+prop_6 = eval prog6 == ref   where     ref = as!!1 + sum as + sum as       where         as = map (*2) [1..20] -prop_7 a = eval prog7 a == ref a+prop_8 a = eval prog8 a == ref a   where     ref a = [a .. a+9] 
tests/NanoFeldsparTree.hs view
@@ -8,22 +8,28 @@   -mkGold1 = B.writeFile "tests/gold/prog1.txt" $ B.pack $ showAST prog1-mkGold2 = B.writeFile "tests/gold/prog2.txt" $ B.pack $ showAST prog2-mkGold3 = B.writeFile "tests/gold/prog3.txt" $ B.pack $ showAST prog3-mkGold4 = B.writeFile "tests/gold/prog4.txt" $ B.pack $ showAST prog4-mkGold5 = B.writeFile "tests/gold/prog5.txt" $ B.pack $ showAST prog5-mkGold6 = B.writeFile "tests/gold/prog6.txt" $ B.pack $ showAST prog6-mkGold7 = B.writeFile "tests/gold/prog7.txt" $ B.pack $ showAST prog7+mkGold_scProd = B.writeFile "tests/gold/scProd.txt" $ B.pack $ showAST scProd+mkGold_matMul = B.writeFile "tests/gold/matMul.txt" $ B.pack $ showAST matMul+mkGold_prog1  = B.writeFile "tests/gold/prog1.txt"  $ B.pack $ showAST prog1+mkGold_prog2  = B.writeFile "tests/gold/prog2.txt"  $ B.pack $ showAST prog2+mkGold_prog3  = B.writeFile "tests/gold/prog3.txt"  $ B.pack $ showAST prog3+mkGold_prog4  = B.writeFile "tests/gold/prog4.txt"  $ B.pack $ showAST prog4+mkGold_prog5  = B.writeFile "tests/gold/prog5.txt"  $ B.pack $ showAST prog5+mkGold_prog6  = B.writeFile "tests/gold/prog6.txt"  $ B.pack $ showAST prog6+mkGold_prog7  = B.writeFile "tests/gold/prog7.txt"  $ B.pack $ showAST prog7+mkGold_prog8  = B.writeFile "tests/gold/prog8.txt"  $ B.pack $ showAST prog8  tests = testGroup "TreeTests"-    [ goldenVsString "prog1" "tests/gold/prog1.txt" $ return $ B.pack $ showAST prog1-    , goldenVsString "prog2" "tests/gold/prog2.txt" $ return $ B.pack $ showAST prog2-    , goldenVsString "prog3" "tests/gold/prog3.txt" $ return $ B.pack $ showAST prog3-    , goldenVsString "prog4" "tests/gold/prog4.txt" $ return $ B.pack $ showAST prog4-    , goldenVsString "prog5" "tests/gold/prog5.txt" $ return $ B.pack $ showAST prog5-    , goldenVsString "prog6" "tests/gold/prog6.txt" $ return $ B.pack $ showAST prog6-    , goldenVsString "prog7" "tests/gold/prog7.txt" $ return $ B.pack $ showAST prog7+    [ goldenVsString "scProd" "tests/gold/scProd.txt" $ return $ B.pack $ showAST scProd+    , goldenVsString "matMul" "tests/gold/matMul.txt" $ return $ B.pack $ showAST matMul+    , goldenVsString "prog1"  "tests/gold/prog1.txt"  $ return $ B.pack $ showAST prog1+    , goldenVsString "prog2"  "tests/gold/prog2.txt"  $ return $ B.pack $ showAST prog2+    , goldenVsString "prog3"  "tests/gold/prog3.txt"  $ return $ B.pack $ showAST prog3+    , goldenVsString "prog4"  "tests/gold/prog4.txt"  $ return $ B.pack $ showAST prog4+    , goldenVsString "prog5"  "tests/gold/prog5.txt"  $ return $ B.pack $ showAST prog5+    , goldenVsString "prog6"  "tests/gold/prog6.txt"  $ return $ B.pack $ showAST prog6+    , goldenVsString "prog7"  "tests/gold/prog7.txt"  $ return $ B.pack $ showAST prog7+    , goldenVsString "prog8"  "tests/gold/prog8.txt"  $ return $ B.pack $ showAST prog8     ]  main = defaultMain [tests]
+ tests/gold/matMul.txt view
@@ -0,0 +1,87 @@+Lambda 0+|+`- Lambda 1+   |+   `- Let 6+      |+      +- arrLength+      |  |+      |  `- getIx+      |     |+      |     +- var:1+      |     |+      |     `- 0+      |+      `- Let 7+         |+         +- arrLength+         |  |+         |  `- var:1+         |+         `- parallel+            |+            +- arrLength+            |  |+            |  `- var:0+            |+            `- Lambda 2+               |+               `- Let 8+                  |+                  +- min+                  |  |+                  |  +- arrLength+                  |  |  |+                  |  |  `- getIx+                  |  |     |+                  |  |     +- var:0+                  |  |     |+                  |  |     `- var:2+                  |  |+                  |  `- var:7+                  |+                  `- Let 9+                     |+                     +- getIx+                     |  |+                     |  +- var:0+                     |  |+                     |  `- var:2+                     |+                     `- parallel+                        |+                        +- var:6+                        |+                        `- Lambda 3+                           |+                           `- forLoop+                              |+                              +- var:8+                              |+                              +- 0.0+                              |+                              `- Lambda 4+                                 |+                                 `- Lambda 5+                                    |+                                    `- (+)+                                       |+                                       +- (*)+                                       |  |+                                       |  +- getIx+                                       |  |  |+                                       |  |  +- var:9+                                       |  |  |+                                       |  |  `- var:4+                                       |  |+                                       |  `- getIx+                                       |     |+                                       |     +- getIx+                                       |     |  |+                                       |     |  +- var:1+                                       |     |  |+                                       |     |  `- var:4+                                       |     |+                                       |     `- var:3+                                       |+                                       `- var:5
tests/gold/prog3.txt view
@@ -38,26 +38,22 @@             |             `- Lambda 2                |-               `- Let 6-                  |-                  +- (+)-                  |  |-                  |  +- (-)-                  |  |  |-                  |  |  +- (-)-                  |  |  |  |-                  |  |  |  +- var:4-                  |  |  |  |-                  |  |  |  `- var:2-                  |  |  |-                  |  |  `- 1-                  |  |-                  |  `- var:5+               `- Lambda 3                   |-                  `- Lambda 3+                  `- (+)                      |-                     `- (+)-                        |-                        +- var:6-                        |-                        `- var:3+                     +- (+)+                     |  |+                     |  +- (-)+                     |  |  |+                     |  |  +- (-)+                     |  |  |  |+                     |  |  |  +- var:4+                     |  |  |  |+                     |  |  |  `- var:2+                     |  |  |+                     |  |  `- 1+                     |  |+                     |  `- var:5+                     |+                     `- var:3
tests/gold/prog4.txt view
@@ -1,43 +1,21 @@ Lambda 0 |-`- Let 1+`- Let 2    |-   +- tup2+   +- (+)    |  |-   |  +- (*)-   |  |  |-   |  |  +- var:0-   |  |  |-   |  |  `- 2+   |  +- var:0    |  |-   |  `- (*)-   |     |-   |     +- var:0-   |     |-   |     `- 3+   |  `- var:0    |-   `- Let 2+   `- parallel       |-      +- sel1-      |  |-      |  `- var:1+      +- var:0       |-      `- Let 3-         |-         +- sel2-         |  |-         |  `- var:1+      `- Lambda 1          |          `- (*)             |-            +- (-)-            |  |-            |  +- var:2-            |  |-            |  `- var:3+            +- var:2             |-            `- (-)-               |-               +- var:3-               |-               `- var:2+            `- var:1
tests/gold/prog5.txt view
@@ -1,71 +1,43 @@-Let 9-|-+- parallel-|  |-|  +- (+)-|  |  |-|  |  +- (-)-|  |  |  |-|  |  |  +- 20-|  |  |  |-|  |  |  `- 1-|  |  |-|  |  `- 1-|  |-|  `- Lambda 0-|     |-|     `- (+)-|        |-|        +- var:0-|        |-|        `- 1+Lambda 0 |-`- Let 11+`- Let 1    |-   +- forLoop+   +- tup2    |  |-   |  +- arrLength+   |  +- (*)    |  |  |-   |  |  `- var:9-   |  |-   |  +- 0+   |  |  +- var:0+   |  |  |+   |  |  `- 2    |  |-   |  `- Lambda 2+   |  `- (*)    |     |-   |     `- Let 10-   |        |-   |        +- (*)-   |        |  |-   |        |  +- getIx-   |        |  |  |-   |        |  |  +- var:9-   |        |  |  |-   |        |  |  `- var:2-   |        |  |-   |        |  `- 2-   |        |-   |        `- Lambda 3-   |           |-   |           `- (+)-   |              |-   |              +- var:10-   |              |-   |              `- var:3+   |     +- var:0+   |     |+   |     `- 3    |-   `- (+)+   `- Let 2       |-      +- (+)-      |  |-      |  +- (*)-      |  |  |-      |  |  +- getIx-      |  |  |  |-      |  |  |  +- var:9-      |  |  |  |-      |  |  |  `- 1-      |  |  |-      |  |  `- 2+      +- sel1       |  |-      |  `- var:11+      |  `- var:1       |-      `- var:11+      `- Let 3+         |+         +- sel2+         |  |+         |  `- var:1+         |+         `- (*)+            |+            +- (-)+            |  |+            |  +- var:2+            |  |+            |  `- var:3+            |+            `- (-)+               |+               +- var:3+               |+               `- var:2
tests/gold/prog6.txt view
@@ -1,25 +1,67 @@-Let 1+Let 9 |-+- max++- parallel |  |-|  +- 5+|  +- (+)+|  |  |+|  |  +- (-)+|  |  |  |+|  |  |  +- 20+|  |  |  |+|  |  |  `- 1+|  |  |+|  |  `- 1 |  |-|  `- (+)-|     |-|     +- 6+|  `- Lambda 0 |     |-|     `- 7+|     `- (+)+|        |+|        +- var:0+|        |+|        `- 1 |-`- Lambda 0+`- Let 10    |-   `- condition+   +- forLoop+   |  |+   |  +- arrLength+   |  |  |+   |  |  `- var:9+   |  |+   |  +- 0+   |  |+   |  `- Lambda 2+   |     |+   |     `- Lambda 3+   |        |+   |        `- (+)+   |           |+   |           +- (*)+   |           |  |+   |           |  +- getIx+   |           |  |  |+   |           |  |  +- var:9+   |           |  |  |+   |           |  |  `- var:2+   |           |  |+   |           |  `- 2+   |           |+   |           `- var:3+   |+   `- (+)       |-      +- (==)+      +- (+)       |  |-      |  +- var:0+      |  +- (*)+      |  |  |+      |  |  +- getIx+      |  |  |  |+      |  |  |  +- var:9+      |  |  |  |+      |  |  |  `- 1+      |  |  |+      |  |  `- 2       |  |-      |  `- 10-      |-      +- var:1+      |  `- var:10       |-      `- var:1+      `- var:10
tests/gold/prog7.txt view
@@ -1,39 +1,25 @@ Lambda 0 |-`- Let 3+`- Let 1    |-   +- parallel+   +- max    |  |-   |  +- 10+   |  +- 5    |  |-   |  `- Lambda 1+   |  `- (+)    |     |-   |     `- (+)-   |        |-   |        +- var:1-   |        |-   |        `- var:0+   |     +- 6+   |     |+   |     `- 7    |    `- condition       |       +- (==)       |  |-      |  +- (*)-      |  |  |-      |  |  +- (*)-      |  |  |  |-      |  |  |  +- (*)-      |  |  |  |  |-      |  |  |  |  +- var:0-      |  |  |  |  |-      |  |  |  |  `- var:0-      |  |  |  |-      |  |  |  `- var:0-      |  |  |-      |  |  `- var:0+      |  +- var:0       |  |-      |  `- 23+      |  `- 10       |-      +- var:3+      +- var:1       |-      `- var:3+      `- var:1
+ tests/gold/prog8.txt view
@@ -0,0 +1,39 @@+Lambda 0+|+`- Let 3+   |+   +- parallel+   |  |+   |  +- 10+   |  |+   |  `- Lambda 1+   |     |+   |     `- (+)+   |        |+   |        +- var:1+   |        |+   |        `- var:0+   |+   `- condition+      |+      +- (==)+      |  |+      |  +- (*)+      |  |  |+      |  |  +- (*)+      |  |  |  |+      |  |  |  +- (*)+      |  |  |  |  |+      |  |  |  |  +- var:0+      |  |  |  |  |+      |  |  |  |  `- var:0+      |  |  |  |+      |  |  |  `- var:0+      |  |  |+      |  |  `- var:0+      |  |+      |  `- 23+      |+      +- var:3+      |+      `- var:3
+ tests/gold/scProd.txt view
@@ -0,0 +1,39 @@+Lambda 0+|+`- Lambda 1+   |+   `- forLoop+      |+      +- min+      |  |+      |  +- arrLength+      |  |  |+      |  |  `- var:0+      |  |+      |  `- arrLength+      |     |+      |     `- var:1+      |+      +- 0.0+      |+      `- Lambda 2+         |+         `- Lambda 3+            |+            `- (+)+               |+               +- (*)+               |  |+               |  +- getIx+               |  |  |+               |  |  +- var:0+               |  |  |+               |  |  `- var:2+               |  |+               |  `- getIx+               |     |+               |     +- var:1+               |     |+               |     `- var:2+               |+               `- var:3