[Haskell-cafe] how to #include files within parsec ... without unsafePerformIO?

Daniel Schüssler anotheraddress at gmx.de
Thu Jun 18 11:22:23 EDT 2009


Hi,

ParsecT with m=IO? Your 'do' block would become:

     do
       i <- getInput
       included <- liftIO readI -- import Control.Monad.Trans for liftIO
       setInput included
       a <- my_str
       setInput i
       b <- my_str
       return $ a ++ " //\n\n " ++ b
     where
       readI = readFile "experiment.hs"


Maybe I'm misunderstanding the problem.

Greetings,
Daniel


On Thursday 18 June 2009 13:58:53 Leonard Siebeneicher wrote:
> Dear reader,
>
> I wonder whether there is a 'general' working solution to include files
> within a parsec parser. Without the need of unsafePerformIO.
>
> Appending an example program, using unsafePerformIO.
>
> Thanx for reading.
>
> Greetings,
> Leonard Siebeneicher
>
>
> --- Begin: experiment.hs ---
> import Text.ParserCombinators.Parsec
> import System.IO.Unsafe
>
> my_str :: Parser String
> my_str = many1 anyToken
>
> wrap_input :: Parser String -> Parser String
> wrap_input p =
>     do
>       i <- getInput
>       setInput readI
>       a <- my_str
>       setInput i
>       b <- my_str
>       return $ a ++ " //\n\n " ++ b
>     where
>       {- Aaaah ... any solution without unsafePerformIO? -}
>       readI = unsafePerformIO (readFile "experiment.hs")
>
>
> main =
>     case parse (wrap_input my_str) "" "eintest" of
>       Left err -> putStrLn "Error raised"
>       Right ostr -> putStrLn ostr
> --- End: experiment.hs ---
>
>
> ___
> Thinking about a special type like
>
> data MyInclude = PlainText String
>
>                | IncludeFile String
>
> the parser could generate [MyInclude] data, but it does not work
> generally.
>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe



More information about the Haskell-Cafe mailing list