58 lines
1.8 KiB
Haskell
58 lines
1.8 KiB
Haskell
{-|
|
|
Module : Core.TH
|
|
Description : Core quasiquoters
|
|
-}
|
|
module Core.TH
|
|
( coreExpr
|
|
, coreProg
|
|
, coreExprT
|
|
, coreProgT
|
|
)
|
|
where
|
|
----------------------------------------------------------------------------------
|
|
import Language.Haskell.TH
|
|
import Language.Haskell.TH.Syntax hiding (Module)
|
|
import Language.Haskell.TH.Quote
|
|
import Control.Monad ((>=>))
|
|
import Control.Monad.IO.Class
|
|
import Control.Arrow ((>>>))
|
|
import Compiler.RLPC
|
|
import Data.Default.Class (def)
|
|
import Data.Text (Text)
|
|
import Data.Text qualified as T
|
|
import Core.Parse
|
|
import Core.Lex
|
|
import Core.Syntax
|
|
import Core.HindleyMilner (checkCoreProgR, checkCoreExprR)
|
|
----------------------------------------------------------------------------------
|
|
|
|
coreProg :: QuasiQuoter
|
|
coreProg = mkqq $ lexCoreR >=> parseCoreProgR
|
|
|
|
coreExpr :: QuasiQuoter
|
|
coreExpr = mkqq $ lexCoreR >=> parseCoreExprR
|
|
|
|
-- | Type-checked @coreProg@
|
|
coreProgT :: QuasiQuoter
|
|
coreProgT = mkqq $ lexCoreR >=> parseCoreProgR >=> checkCoreProgR
|
|
|
|
coreExprT :: QuasiQuoter
|
|
coreExprT = mkqq $ lexCoreR >=> parseCoreExprR >=> checkCoreExprR g
|
|
where
|
|
g = [ ("+#", TyCon "Int#" :-> TyCon "Int#" :-> TyCon "Int#")
|
|
, ("id", TyCon "a" :-> TyCon "a")
|
|
, ("fix", (TyCon "a" :-> TyCon "a") :-> TyCon "a")
|
|
]
|
|
|
|
mkqq :: (Lift a) => (Text -> RLPCIO a) -> QuasiQuoter
|
|
mkqq p = QuasiQuoter
|
|
{ quoteExp = mkq p
|
|
, quotePat = error "core quasiquotes may only be used in expressions"
|
|
, quoteType = error "core quasiquotes may only be used in expressions"
|
|
, quoteDec = error "core quasiquotes may only be used in expressions"
|
|
}
|
|
|
|
mkq :: (Lift a) => (Text -> RLPCIO a) -> String -> Q Exp
|
|
mkq parse s = liftIO $ evalRLPCIO def (parse $ T.pack s) >>= lift
|
|
|