module haskell imports libstrategolib signatures/- util signature constructors TopLevel: Ex -> Ex rules /* Approach: Generate code from the bottom up. At every node, we create a pair of the implementation and necessary preamble of IO actions. We concatenate preambles as we go up. Finally, at the toplevel we emit the preamble before returning the final value. */ hs: TopLevel((c,p)) -> $[import System.IO data IOStream = StdIO stdio :: IO IOStream stdio = return StdIO gets :: Show b => IO a -> b -> IO a gets s d = do temp <- s putStr(show d) return temp main = do [p]return [c]] hs: Stream() -> ("stdio", "") hs: Int(x) -> (x, "") hs: Sum( (c, p), (d, q)) -> ($[([c] + [d])], (p,q)) hs: Gets((c, p), (d, q)) -> (c,d,(p,q),"fosgt") hsget: (s, x, p, v) -> (v, [p, $[[v] <- [s] `gets` [x]], "\n"]) hs: To( (c, p), (d, q)) -> (c,d,(p,q),"fosto") hsto: (x, s, p, v) -> (v, [p, $[let [v] = [x]], "\n", $[[s] `gets` [v]], "\n"]) hs: Sequence(l) -> (l, l) strategies haskell = bottomup(try(hs)) // Interface haskell code generation with editor services and file system to-haskell: (selected, _, _, path, project-path) -> (filename, result) with filename := path ; result := selected