-- -- Copyright (C) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons -- -- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- This library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with this library; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -- USA -- -- -- compile and run haskell strings at runtime. -- module System.Eval.Utils ( Import, symbol, escape, getPaths, mkUniqueWith, cleanup, module Data.Maybe, module Control.Monad, ) where import System.Plugins.Load ( Symbol ) import System.Plugins.Utils import System.IO import System.Directory import Data.Char -- -- we export these so that eval() users have a nice time -- import Data.Maybe import Control.Monad -- -- imports Foo's -- type Import = String -- -- distinguished symbol name -- symbol :: Symbol symbol = "resource" -- -- turn a Haskell string into a printable version of the same string -- escape s = concatMap (\c -> showLitChar c $ "") s -- -- For Dynamic eval's, work out the compile and load command lines -- getPaths :: IO ([String],[String]) getPaths = do let make_line = ["-O0","-package","plugins"] return (make_line,[]) -- --------------------------------------------------------------------- -- create the tmp file, and write source into it, using wrapper to -- create extra .hs src. -- mkUniqueWith :: (String -> String -> [Import] -> String) -> String -> [Import] -> IO FilePath mkUniqueWith wrapper src mods = do (tmpf,hdl) <- hMkUnique let nm = mkModid (basename tmpf) -- used as a module name src' = wrapper src nm mods hPutStr hdl src' >> hFlush hdl >> hClose hdl >> return tmpf -- -- remove all the tmp files -- cleanup :: String -> String -> IO () cleanup a b = mapM_ removeFile [a, b, replaceSuffix b ".hi"]