1 {-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
5 import Data.Text as T (Text)
6 import qualified Data.Text.IO as T
7 import Data.Attoparsec.Text
8 import qualified Data.Map as M
9 import Control.Applicative
10 import System.Environment
14 data Definition = Definition String Term
16 dictionary :: [Definition] -> M.Map String Term
17 dictionary = M.fromList . map (\ (Definition s t) -> (s, t))
19 parseDefinition :: Parser Definition
24 return $! Definition name t
26 parseFile :: Text -> ([Definition], [Term])
27 parseFile txt = case cnt of
30 where cnt = parseOnly (parserF <* endOfInput) txt
32 defs <- many (parseDefinition <* char '\n')
33 terms <- many (parseTerm <* char '\n')
34 return $! (defs, terms)
36 printEval :: Term -> IO ()
38 putStrLn $ show t ++ ":"
39 putStrLn $ " " ++ show (reduce t)
45 (defs, terms) <- parseFile <$> T.readFile filename