forked from glen/fostr
42 lines
1.0 KiB
Plaintext
42 lines
1.0 KiB
Plaintext
module haskell
|
|
imports libstrategolib signatures/-
|
|
|
|
signature
|
|
constructors
|
|
TopLevel: Ex -> Ex
|
|
|
|
rules
|
|
hs: TopLevel(x) -> $[import System.IO
|
|
data IOStream = StdIO
|
|
|
|
stdio :: IO IOStream
|
|
stdio = return StdIO
|
|
|
|
receives :: Show b => IO a -> b -> IO a
|
|
receives s d = do
|
|
temp <- s
|
|
putStr(show d)
|
|
return temp
|
|
|
|
main = do
|
|
[<hs>x]]
|
|
|
|
hs: Stdio() -> $[stdio]
|
|
hs: Int(x) -> x
|
|
hs: Sum(x) -> $[sum [<hs>x]]
|
|
hs: Receives(x, y) -> $[[<hs>x] `receives` [<hs>y]]
|
|
hs: [] -> $<[]>
|
|
hs: [x | xs] -> $<[<<hs>x><<hstail>xs>]>
|
|
|
|
strategies
|
|
// wrap expression in a toplevel and then apply code generation
|
|
haskell = !TopLevel(<id>); hs
|
|
|
|
// translate each element of a list, prepending each with ',', and concatenate
|
|
hstail = foldr(!"", \ (x,y) -> $<, <<hs>x><y>> \)
|
|
|
|
// Interface haskell code generation with editor services and file system
|
|
to-haskell: (selected, _, _, path, project-path) -> (filename, result)
|
|
with filename := <guarantee-extension(|"hs")> path
|
|
; result := <haskell> selected
|