Frank-0.0: Main.lhs
> {-# OPTIONS_GHC -F -pgmF she #-}
> {-# LANGUAGE TypeOperators, KindSignatures, GADTs, TypeSynonymInstances,
> FlexibleInstances, GeneralizedNewtypeDeriving, TupleSections,
> MultiParamTypeClasses #-}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> module Main where
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> import Prelude hiding (elem, all)
> import Data.Char
> import Data.List hiding (elem, all)
> import Data.Monoid
> import Data.Foldable
> import Data.Traversable
> import Control.Applicative
> import Control.Monad
> import Control.Newtype
> import Data.Void
> import Control.Arrow
> import System.Environment
> import System.IO
> import Gubbins
> import Types
> import Pa
> import Syntax
> import Unify
> import Template
> import Check
> import ElabMonad
> import Elab
> import Run
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Line Checking %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> lineCh :: ([Pat], Raw) -> ElabM (Template, ([PAT], TM {CHK}))
> lineCh l@(ps, r) = err (Line l) $ do
> ((f, (i, (g, ps))), (ss, v)) <- lhsCh ps
> t <- cxLocal g (withSigs ss (checkR v r))
> return (f, (ps, t))
> lhsCh :: [Pat] -> ElabM ((Template, (Int, (Bwd Entry, [PAT]))), ([Sig], VT))
> lhsCh ps = patTree ps [] >>= \ t -> do
> info <- getInfoE
> case t of
> TLeaf _ _ -> moanE $ BadLhs ps
> TNode f ts -> case lookup f (funDecls info) of
> Nothing -> moanE $ BadLhs ps
> Just (i, vs, sa, v) -> do
> ss <- getSigsE
> gp <- ttpsCh f (map (`sAct` ss) vs) ts
> return ((f, (i, gp)), (sAct sa ss, sAct v ss))
Must check coverage!
> makeDefs :: Source -> Either TError [(Template, VAL)]
> makeDefs src = case moc (typeInfo src) of
> Left (e :? _) -> Left e
> Right info -> do
> tpes <- baseInfo info (traverse lineCh (sourceDefs src))
> let fs = [ (t, [pes | (u, pes) <- tpes, t == u])
> | (t, _) <- funDecls info
> ]
> let defs = primitiveDefs ++
> map (\ (t, pes) -> (t, VU (lambda defs [] pes))) fs
> return defs
> frank :: String -> IO ()
> frank s =
> let src = source s in do
> case sourceJunk src of
> [] -> return ()
> x -> putStrLn "Syntax Errors!" >> print x
> case makeDefs src of
> Left e -> putStrLn $ show e
> Right defs -> putStrLn =<<
> display (eval defs [] (H (FN [Mark "main"]) :/ []))
> main :: IO ()
> main = do
> hSetBuffering stdout NoBuffering
> hSetBuffering stdin NoBuffering
> hSetEcho stdin False
> args <- getArgs
> case args of
> [] -> frank =<< getContents
> (f : _) -> do
> frank =<< readFile (if elem '.' f then f else f ++ ".fk")
> return ()