Commit bcd7d35f authored by bbr's avatar bbr
Browse files

oracle production now working from kicsi

- some changes in compiler to call prophecy
- new in makefile to produce bin/prophecy (but not part of make all yet)
- script kghci recovered
- Oracle added to internal Libraries of All_Libraries
- Added support for type flat curry synonyms in compiler
  therefore synonym string eliminated from external prelude
- added name for debug modules in Names.hs
- Distribution modules now (nearly) identical
- prophecy transformation with make and force option
- added wrapper for prim_bind
parent 3e5a710a
......@@ -6,6 +6,8 @@ THIS = ../kics/
KGHC = ghc --make -fglasgow-exts -i$(LIBS) -H500m
GHC = ghc --make -fglasgow-exts -i$(SRC) -H500m
LIBS = $(shell $(BIN)kicslib)
KICS = $(BIN)kics -make
ORACLE = $(SRC)oracle/
all: $(SRC)InstallDir.hs $(BIN)generate $(BIN)kicslib $(BIN)kics $(BIN)kicsi libs
......@@ -39,7 +41,7 @@ else
endif
$(KGHC) $(SRC)kicsi -o $(BIN)kicsi
$(BIN)kics: $(BIN)kicslib $(SRC)CurryToHaskell.hs $(SRC)PreTrans.hs
$(BIN)kics: $(BIN)kicslib $(SRC)CurryToHaskell.hs $(SRC)PreTrans.hs $(SRC)kics.hs
$(KGHC) $(SRC)kics -o $(BIN)kics
.PHONY: runtime
......@@ -48,7 +50,7 @@ runtime: $(SRC)InstallDir.hs
.PHONY: libs
libs: $(BIN)kics runtime
$(BIN)kics -v -make $(LIB)All_Libraries
$(KICS) $(LIB)All_Libraries
.PHONY: clean
clean:
......@@ -79,3 +81,10 @@ dist:
cp $(THIS)$(DIST)kics_src.tgz ~/public_html/download/
chmod a+r ~/public_html/download/kics_src.tgz
oracle: $(BIN)stricths $(BIN)prophecy
$(BIN)stricths:
$(KICS) -executable -o $(BIN)stricths -userlibpath $(ORACLE) stricths.curry
$(BIN)prophecy: $(ORACLE)Transform.curry
$(KICS) -executable -o $(BIN)prophecy -userlibpath $(ORACLE) Transform.curry
#!/bin/sh
export KICS_LIB=`kicslib`
ghci -fglasgow-exts -i$KICS_LIB
\ No newline at end of file
......@@ -188,10 +188,13 @@ cymake opts = safeSystem (verbose opts)
(cyCall opts ++ filename opts
++ if verbose opts then "" else " 1>/dev/null ")
fcypp opts = safeSystem (verbose opts)
("fcypp -module " ++ mainModule opts
++" -main expression " ++ filename opts
++if verbose opts then "" else " 1>/dev/null ")
prophecy opts = safeSystem (verbose opts) $
"prophecy "
++ (if make opts then " -m " else "")
++ (if force opts then " -f " else "")
++ filename opts
++ if verbose opts then "" else " 1>/dev/null "
readConfig = do
home <- getEnv "HOME"
......@@ -314,7 +317,7 @@ safeReadFlat opts s = do
warning fn path [] = fail ("file "++fn++" not found in path "++path)
warning fn path [] = fail ("module "++fn++" not found in path "++path)
warning _ _ (f:fs) = do
mapM_ (safeIO . putStrLn) (map ("further file found (but ignored) "++) fs)
return f
......@@ -363,4 +366,5 @@ readExternalSpec opts p = do
baseName f = case reverse f of
'y':'r':'r':'u':'c':'.':f' -> reverse f'
_ -> f
\ No newline at end of file
_ -> f
......@@ -8,7 +8,6 @@ import List
import Char
import System
import PreTrans hiding (nub,pre)
--import ProduceOracle
import Maybe
import SafeCalls
import Brace
......@@ -17,7 +16,7 @@ import Directory (doesFileExist)
import Names (dataHsName,instHsName,funcHsName,
extDataHsName,extInstHsName,extFuncHsName,
extDataModName,extInstModName,extFuncModName,
dataModName,instModName,modName,
dataModName,instModName,modName,dbgModName,
elimInfix,funName,functionName,constructorName)
import qualified Names as N
import Monad
......@@ -67,7 +66,6 @@ compile opts = do
process :: Options -> Safe IO (String,[String],Options)
process opts0@(Opts{filename=fn}) = do
put opts0 ("make: "++show (make opts0))
prog <- safeReadFlat opts0 (fn++".fcy")
unless (executable opts0 && not (verbose opts0))
(safeIO (putStrLn ("processing: "++progName prog)))
......@@ -105,28 +103,23 @@ callFrontend opts@(Opts{filename=givenFile}) = do
basename = if suf == ".curry" then pre else givenFile
lib = libpath opts
foundSources <- safeIO (findFileInPath (basename++".curry") lib)
unless (null foundSources) (do cymake opts
if debug opts && executable opts
then fcypp opts
else return ())
let opts' = opts{filename=basename}
return (if debug opts then opts' {mainFunc="main_"} else opts')
unless (null foundSources) (if debug opts
then prophecy opts
else cymake opts)
return opts{filename=if debug opts then dbgModName basename else basename}
getFlatCurryFileName opts@(Opts{filename=basename}) = do
let lib = libpath opts
foundFiles <- safeIO (findFileInPath (basename++".fcy") lib)
foundFiles <- safeIO (findFileInPath (basename ++ ".fcy") lib)
foundFile <- warning basename lib foundFiles
let foundBasename = take (length foundFile-4) foundFile
return (opts{filename=foundBasename})
notUptodate opts@(Opts{filename=foundBasename}) = do
--tInterface <- getModTime (foundBasename++".fint")
tSource <- getModTime (foundBasename++".fcy")
tSource <- getModTime (foundBasename ++ ".fcy")
tDestination <- getModTime (funcHsName foundBasename)
--let interfaceOld = force opts || tInterface > tDestination
return (tSource > tDestination)
applyFlatTransformations opts prog = do
let auxNames = generateAuxNames (progFuncs prog)
mexprog = if executable opts then addExec auxNames opts prog
......@@ -281,7 +274,7 @@ transform typeMapping aux opts0 (Prog name imports types funcs _)
-- the generated types, instances and functions
dataTypes = map (transTypeDecl opts{consUse=DataDef})
(filter isToTransform typeDecls)
(typeSyns++filter isToTransform typeDecls)
instances = genInstances BaseCurry baseCurryInstance opts typeDecls
++ genInstances Curry curryInstance opts typeDecls
++ genInstances Show showInstance opts typeDecls
......@@ -291,8 +284,8 @@ transform typeMapping aux opts0 (Prog name imports types funcs _)
mainModule = mainMod aux funcName opts
-- information about original module
typeDecls = filter (\t-> isDataTypeDecl t &&
not (elem (snd $ typeName t) (extData opts))) types
(typeSyns,typeDecls) = partition isTypeSyn $
filter (\t-> not (elem (snd $ typeName t) (extData opts))) types
isToTransform t = case lookup (snd $ typeName t) (extInsts opts) of
Nothing -> True
Just is -> not (elem Declaration is)
......@@ -327,22 +320,27 @@ addExec (aux1,aux2) opts (Prog m is ts funcs ops) =
case lookup (mainFunc opts) lfs of
Just f@(Func n a vis t (Rule vs e))
| t == ioT unitT -> prog False
[Func a2 a vis t (Rule [] (flatApp n []))]
[Func a2 0 vis t (Rule [] (flatApp n []))]
| isIOType t -> prog True
[Func a1 a vis (monomorph t) (Rule [] (flatApp n [])),
Func a2 a vis (ioT unitT) (Rule [] (flatApp printIO [calla1 t]))]
| isFuncType t -> Right (mainFunc opts++" is no constant")
[Func a1 0 vis (monomorph t) (Rule [] (flatApp n [])),
Func a2 0 vis (ioT unitT) (Rule [] (flatApp printIO [calla1 t]))]
| isFuncType t && not (debug opts)
|| isFuncType (range t) -> Right (mainFunc opts++" is no constant")
| debug opts -> prog True
[Func a1 1 vis (monomorph t) (Rule [0] (flatApp n [Var 0])),
Func a2 0 vis (ioT unitT) (Rule []
(flatBind (flatGst (calla1 t)) (startFunc opts)))]
| otherwise -> prog True
[Func a1 a vis (monomorph t) (Rule [] (flatApp n [])),
Func a2 a vis (ioT unitT) (Rule []
[Func a1 0 vis (monomorph t) (Rule [] (flatApp n [])),
Func a2 0 vis (ioT unitT) (Rule []
(flatBind (flatGst (calla1 t)) (startFunc opts)))]
_ -> Right (mainFunc opts++" undefined")
where
a1 = (m,aux1)
a2 = (m,aux2)
calla1 t = if isFuncType t
then Comb (FuncPartCall (typeArity t)) a1 []
else Comb FuncCall a1 []
calla1 t = if debug opts
then Comb FuncCall ("Oracle","oracle") [Comb (FuncPartCall 1) a1 []]
else Comb FuncCall a1 []
printIO = ("Interactive","printIO")
lfs = zip (map (snd . funcName) funcs) funcs
......
......@@ -63,6 +63,7 @@ modName s = insertName "Curry" s
dataMName = "Data"
instMName = "Instances"
funcMName = "Functions"
dbgMName = "Oracle"
external = insertName "External"
......@@ -73,6 +74,7 @@ extFuncMName = external funcMName
dataModName = insertName dataMName
instModName = insertName instMName
funcModName = insertName funcMName
dbgModName = insertName dbgMName
extDataModName = insertName extDataMName
extInstModName = insertName extInstMName
......@@ -82,6 +84,8 @@ dataHsName s = dataModName s ++".hs"
instHsName s = instModName s ++".hs"
funcHsName s = modName s ++".hs"
extDataHsName s = extDataModName s ++ ".hs"
extInstHsName s = extInstModName s ++ ".hs"
extFuncHsName s = extFuncModName s ++ ".hs"
......@@ -97,3 +101,5 @@ freeVarName = addPrefix "FreeVar"
failName = addPrefix "Fail"
orName = addPrefix "Or"
suspName = addPrefix "Susp"
......@@ -223,6 +223,7 @@ pre s = ("Prelude",s)
-- typing ambiguous type variables
------------------------------------------------------------
makeTypeMap :: [Prog] -> QName -> QName
makeTypeMap ps = \s->maybe (error ("type map: "++show s)) id (myLookup s fm)
where
fm = myFromList (concatMap typeMapTypeDecl (concatMap typeDecls ps))
......
......@@ -47,7 +47,6 @@ main = do
(options,state) <- readConfig
files <- getArgs
load files state options
-- interactive state options
interactive state opts = do
mline <- readline (separate "," (loadedFiles state) ++"> ")
......@@ -127,21 +126,38 @@ setMenue (opt:vals) state opts = do
["st"] -> interactive state opts{pm=ST}
["path",path] -> let (thisDir,oldPath)=break (==':') (userlibpath opts)
in interactive state opts{userlibpath=thisDir++':':path++oldPath}
[x:"debug"] -> interactive state (opts {debug=x=='+'})
[x:"d"] -> interactive state (opts {debug=x=='+'})
[x:"time"] -> interactive (state {time=x=='+'}) opts
[x:"t"] -> interactive (state {time=x=='+'}) opts
[x:"verbose"] -> interactive state opts{verbose=x=='+'}
[x:"v"] -> interactive state opts{verbose=x=='+'}
[x:"eval"] -> interactive state opts{eval=x=='+'}
[x:"e"] -> interactive state opts{eval=x=='+'}
[x:"make"] -> interactive state opts{make=x=='+'}
[x:"m"] -> interactive state opts{make=x=='+'}
("rts":_) -> interactive (state {rts=unwords vals}) opts
[x:"force-recompile"] -> interactive state (opts{force=x=='+'})
[x:"f"] -> interactive state (opts{force=x=='+'})
_ -> putStrLn ("unvalid setting. Example \":set ctc\" to " ++
['+':'+':setting] -> longSetting True state opts setting
['-':'-':setting] -> longSetting False state opts setting
['+':settings] -> shortSettings True state opts settings
['-':settings] -> shortSettings False state opts settings
_ -> putStrLn ("invalid setting. Example \":set ctc\" to " ++
"set choice mode to call-time choice") >> interactive state opts
longSetting flag state opts "debug" = interactive state opts{debug=flag}
longSetting flag state opts "time" = interactive state{time=flag} opts
longSetting flag state opts "verbose" = interactive state opts{verbose=flag}
longSetting flag state opts "eval" = interactive state opts{eval=flag}
longSetting flag state opts "make" = interactive state opts{make=flag}
longSetting flag state opts "force" = interactive state opts{force=flag}
longSetting _ state opts _ = putStrLn "invalid setting." >> interactive state opts
shortSettings _ state opts [] = interactive state opts
shortSettings flag state opts ('t':settings) =
shortSettings flag state{time=flag} opts settings
shortSettings flag state opts ('-':settings) =
shortSettings False state opts settings
shortSettings flag state opts ('+':settings) =
shortSettings True state opts settings
shortSettings flag state opts (c:settings) =
shortSettings flag state (newOpts c) settings
where
newOpts 'd' = opts{debug=flag}
newOpts 'v' = opts{verbose=flag}
newOpts 'e' = opts{eval=flag}
newOpts 'm' = opts{make=flag}
newOpts 'f' = opts{force=flag}
newOpts _ = opts
help state opts = do
mapM_ putStrLn
......@@ -257,7 +273,7 @@ reqMod = modName "Request"
moduleHead = "module Request where\n"
imports = concatMap ("\nimport "++)
imports = concatMap ("\nimport "++)
--- This program includes a list of all system libraries
module All_Libraries (
--general libraries
--module AllSolutions,
--module Assertion,
module Char,
......@@ -57,8 +58,6 @@ module All_Libraries (
module XML,
--module XmlConv,
module Interactive,
-- Libraries for meta-programming
module AbstractCurry,
module AbstractCurryPrinter,
......@@ -71,7 +70,11 @@ module All_Libraries (
--module FlatCurryXML,
module FlexRigid,
module Generic,
module Meta) where
module Meta,
--internal libraries
module Interactive,
module Oracle) where
--import AllSolutions
......@@ -132,8 +135,6 @@ import XML
--import XmlConv
import Interactive
-- from directory meta:
import AbstractCurry (CurryProg)
import AbstractCurryPrinter
......@@ -148,3 +149,5 @@ import FlexRigid
import Generic
import Meta hiding (isFree)
import Interactive
import Oracle
\ No newline at end of file
......@@ -5,7 +5,7 @@
--- <b>curryCompiler...</b>.
---
--- @author Bernd Brassel, Michael Hanus
--- @version December 2006
--- @version March 2007
--------------------------------------------------------------------------------
module Distribution (
......@@ -24,7 +24,7 @@ module Distribution (
quiet, fullPath, outfile, logfile,
setQuiet, setFullPath, setOutfile, setLogfile,
callFrontendWithParams
callFrontend,callFrontendWithParams
) where
import List(intersperse)
......@@ -181,47 +181,73 @@ getLoadPathForFile modfile = do
--- @cons ACY - AbstractCurry file ending with .acy
--- @cons UACY - Untyped (without type checking) AbstractCurry file ending with .uacy
--- @cons HTML - colored HTML representation of source program
--- @cons CY - source representation of program
--- @cons CY - source representation employed by the frontend
data FrontendTarget = FCY | FINT | ACY | UACY | HTML | CY
--- Data type for representing parameters supported by the front end
--- of the Curry compiler. The parameters are of the form
--- FrontendParams Quiet FullPath OutFile LogFile
--- where
--- Quiet - work silently
--- FullPath dirs - the complete list of directory names for loading modules
--- OutFile file - output file (currently, only relevant for HTML target)
--- LogFile file - store all output (including errors) of the front end in file
data FrontendParams
= FrontendParams Bool (Maybe [String]) (Maybe String) (Maybe String)
quiet :: FrontendParams -> Bool
quiet (FrontendParams x _ _ _) = x
fullPath :: FrontendParams -> Maybe [String]
fullPath (FrontendParams _ x _ _) = x
outfile,logfile :: FrontendParams -> Maybe String
outfile (FrontendParams _ _ x _) = x
logfile (FrontendParams _ _ _ x) = x
--- Abstract data type for representing parameters supported by the front end
--- of the Curry compiler.
-- The parameters are of the form
-- FrontendParams Quiet FullPath OutFile LogFile
-- where
-- Quiet - work silently
-- FullPath dirs - the complete list of directory names for loading modules
-- OutFile file - output file (currently, only relevant for HTML target)
-- LogFile file - store all output (including errors) of the front end in file
data FrontendParams =
FrontendParams Bool (Maybe [String]) (Maybe String) (Maybe String)
--- The default parameters of the front end.
defaultParams :: FrontendParams
defaultParams = FrontendParams False Nothing Nothing Nothing
--- Set quiet mode of the front end.
setQuiet :: Bool -> FrontendParams -> FrontendParams
setQuiet s (FrontendParams _ x y z) = FrontendParams s x y z
setFullPath :: [String] -> FrontendParams -> FrontendParams
--- Set the full path of the front end.
--- If this parameter is set, the front end searches all modules
--- in this path (instead of using the default path).
setFullPath :: [String] -> FrontendParams -> FrontendParams
setFullPath s (FrontendParams x _ y z) = FrontendParams x (Just s) y z
setOutfile, setLogfile :: String -> FrontendParams -> FrontendParams
--- Set the outfile parameter of the front end.
--- Relevant for HTML generation.
setOutfile :: String -> FrontendParams -> FrontendParams
setOutfile s (FrontendParams x y _ z) = FrontendParams x y (Just s) z
--- Set the logfile parameter of the front end.
--- If this parameter is set, all messages produced by the front end
--- are stored in this file.
setLogfile :: String -> FrontendParams -> FrontendParams
setLogfile s (FrontendParams x y z _) = FrontendParams x y z (Just s)
--- Returns the value of the "quiet" parameter.
quiet :: FrontendParams -> Bool
quiet (FrontendParams x _ _ _) = x
defaultParams :: FrontendParams
defaultParams = FrontendParams False Nothing Nothing Nothing
--- Returns the full path parameter of the front end.
fullPath :: FrontendParams -> Maybe [String]
fullPath (FrontendParams _ x _ _) = x
--- Returns the outfile parameter of the front end.
outfile :: FrontendParams -> Maybe String
outfile (FrontendParams _ _ x _) = x
--- Returns the logfile parameter of the front end.
logfile :: FrontendParams -> Maybe String
logfile (FrontendParams _ _ _ x) = x
--- In order to make sure that compiler generated files (like .fcy, .fint, .acy)
--- are up to date, one can call the front end of the Curry compiler with this action.
--- @param target - the kind of target file to be generated
--- @param progname - the name of the main module of the application to be compiled
callFrontend :: FrontendTarget -> String -> IO ()
callFrontend target = callFrontendWithParams target defaultParams
--- In order to make sure that compiler generated files (like .fcy, .fint, .acy)
--- are up to date, one can call the front end of the Curry compiler
--- with this action where various parameters can be set.
--- @param target - the kind of target file to be generated
--- @param params - parameters for the front end
--- @param progname - the name of the main module of the application to be compiled
callFrontendWithParams :: FrontendTarget -> FrontendParams -> String -> IO ()
......@@ -236,9 +262,11 @@ callFrontendWithParams target params progname = do
else system (syscall++" > "++lf++" 2>&1")
return ()
where
isPakcs | curryCompiler == "pakcs" = True
| curryCompiler == "kics" = False
| otherwise = error "Distribution.callFrontendWithParams: unknown curryCompiler"
isPakcs =
if curryCompiler == "pakcs" then True else
if curryCompiler == "kics" then False
else error "Distribution.callFrontend: unknown curryCompiler"
callParseCurry =
if isPakcs then
do return (installDir++"/bin/parsecurry")
......@@ -270,8 +298,8 @@ callFrontendWithParams target params progname = do
(fullPath params))
else ""
runQuiet | curryCompiler == "kics" = " --no-verb --no-warn --no-overlap-warn "
| curryCompiler == "pakcs" = " -quiet "
runQuiet = if isPakcs then " -quiet "
else " --no-verb --no-warn --no-overlap-warn " -- kics
rcErr :: String -> a -> IO a
rcErr s x = hPutStrLn stderr (s ++ " undefined in rc file") >> return x
......@@ -105,12 +105,6 @@ printException (ErrorCall s) =
printExceptions :: C_Exceptions -> IO a
printExceptions e = printException e >> error "program error"
-----------------------------------------------------------------------
-- Basic Type declarations
-----------------------------------------------------------------------
type C_String = List C_Char
-----------------------------------------------------------------------
-- Int and Float
-----------------------------------------------------------------------
......
......@@ -2,10 +2,22 @@
---
--- @version Feb, 2007
---
module Oracle where
module Oracle (
Ref, Node, Cost,
partCons, partFunc, partCall,
apply, ($!) ,($!!), ($#), ($##), prim_bind,
compose,
oracle,
replace, collapse, expand
)where
import IOExts
import Unsafe
import System (getProgName)
infixr 0 $!, $!!, $#, $##
......@@ -47,14 +59,19 @@ apply f x r = f r x
($##) :: (Ref -> a -> b) -> a -> Ref -> b
($##) f x r = f r Prelude.$## x
--- Wrapper for bind in io monad
prim_bind :: (IO a) -> (Ref -> a -> IO b) -> Ref -> IO b
prim_bind a b r = Prelude.prim_bind a (b r)
--- Function composition (Prelude version may be transformed)
compose :: (b -> c) -> (a -> b) -> a -> c
compose f g x = f (g x)
--- Computes the oracle for a computation.
oracle :: String -> (Ref -> a) -> ()
oracle mod app = unsafePerformIO $ do
oracle :: (Ref -> a) -> a
oracle app = unsafePerformIO $ do
mod <- getProgName
startMarker <- newIORef (error "startMarker")
endMarker <- newIORef (error "endMarker")
mainR <- newIORef (Node startMarker 0 endMarker)
......@@ -63,7 +80,7 @@ oracle mod app = unsafePerformIO $ do
writeIORef endMarker (Node mainR 0 marker)
x <- return Prelude.$!! app mainR
finalize mod startMarker endMarker
-- return x
return x
--- Signals the end of the computation.
finalize :: String -> Ref -> Ref -> IO ()
......
......@@ -15,7 +15,7 @@ module Time(ClockTime,
--- ClockTime represents a clock time in some internal representation.
data ClockTime = CTime Int
data ClockTime = CTime Int
--- A calendar time is presented in the following form:
--- (CalendarTime year month day hour minute second timezone)
......
......@@ -9,7 +9,7 @@ module Make (
ModuleName,
Path,
FileName,
make, upToDate) where
make, obsolete) where
import FlatCurry
import Distribution
......@@ -25,7 +25,7 @@ type Path = String
type FileName = String
type TestAct = Path -> ModuleName -> IO Bool
type ProgAct = Prog -> IO ()
type ProgAct = Path -> Prog -> IO ()
type Done = IORef (FM String ())
......@@ -33,7 +33,9 @@ type Done = IORef (FM String ())
--- if test was True.
make :: ModuleName -> TestAct -> ProgAct -> IO ()
make modu test act = do
putStrLn "ensuring existence of fcy/fint files..."
callFrontend FCY modu
putStrLn "...ensured"
done <- newIORef (emptyFM (\ x y -> not (leqString x y)))
workUpDependence done test act modu
......@@ -50,16 +52,23 @@ process fm done test act modu = do
mapIO_ (workUpDependence done test act) imps
let dir = dirName fn++"/"
mk <- test dir modu
if mk then (readFlatCurryFile (dir++modu++".fcy") >>= act) else return ()
if mk then (readFlatCurryFile (dir++modu++".fcy") >>= act dir) else return ()
--- a standard test if a given filename is new than another
upToDate :: (String -> String) -> (String -> String) -> TestAct
upToDate f1 f2 dir modu = do
--- a standard test if a given filename is newer than another
obsolete :: (String -> String) -> (String -> String) -> TestAct
obsolete f1 f2 dir modu = do
let fn1 = dir++f1 modu
fn2 = dir++f2 modu
t1 <- getModificationTime fn1
t2 <- getModificationTime fn2
return (compareClockTime t1 t2/=LT)
ex <- doesFileExist fn2
if ex then do
t1 <- getModificationTime fn1
t2 <- getModificationTime fn2
let old = compareClockTime t1 t2/=LT
putStrLn $ (if old then "obsolete : "
else "up-to-date: ") ++ f2 modu
return old
else putStrLn ("missing : "++ f2 modu) >>
return True
fastReadImports :: FileName -> IO [String]
fastReadImports fn = do
......
--- Program transformation to compute the oracle.
---
--- @version Feb, 2007
--- @version July 2007
--- new: employ make for modulewise transformation
---
module Transform where
import System (getArgs)
......@@ -11,126 +13,152 @@ import FlatCurry
import FlatCurryGoodies
import Wrapper