1 {-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
5 import Data.Text as T (Text, pack)
6 import qualified Data.Text.IO as T
7 import Data.Attoparsec.Text
8 import qualified Data.Map as M
9 import Control.Applicative
11 import System.Environment
14 import Lambda.Parser.Fancy
16 data Definition = Definition String Term
18 dictionary :: [Definition] -> M.Map String Term
19 dictionary = M.fromList . map (\ (Definition s t) -> (s, t))
21 parseDefinition :: Parser Definition
26 return $! Definition name t
28 parseImport :: Parser String
30 string (T.pack "import ")
33 parseFile :: Text -> ([FilePath], [Definition], [Term])
34 parseFile txt = case cnt of
37 where cnt = parseOnly (parserF <* endOfInput) txt
39 imports <- many (parseImport <* char '\n')
40 defs <- many (parseDefinition <* char '\n')
41 terms <- many (parseTerm <* char '\n')
42 return (imports, defs, terms)
44 printEval :: (Term -> Term) -> Term -> IO ()
46 putStrLn $ show t ++ ":"
47 putStrLn $ " " ++ show (reduce $ def t)
50 makeDefTerm :: [Definition] -> Term -> Term
51 makeDefTerm (Definition name dTerm : ds) t = App (Lambda name (makeDefTerm ds t)) dTerm
57 (imports, defs, terms) <- parseFile <$> T.readFile filename
58 importDefs <- forM imports $ \ file -> do
59 (_, idefs, _) <- parseFile <$> T.readFile (file ++ ".lc")
61 let defT = makeDefTerm $ concat importDefs ++ defs
62 mapM_ (printEval defT) terms