{-# LANGUAGE TemplateHaskell, QuasiQuotes, DeriveDataTypeable, StandaloneDeriving #-} module Language.Lambda.Quote where import Language.Haskell.TH.Quote import Language.Haskell.TH import Language.Lambda.Parser import Language.Lambda.AST import Text.Parsec (runParser) import Data.Data deriving instance Typeable1 GExpr deriving instance (Data a) => Data (GExpr a) --TODO make the pattern quoter and the anti expr lam :: QuasiQuoter lam = QuasiQuoter quoteExprExp undefined undefined undefined parseExpr :: Monad m => (String, Int, Int) -> String -> m Expr parseExpr (file, line, col) s = result where result = case runParser top_expr () file s of Left err -> fail $ (show err ++ " at file " ++ file ++ " at line " ++ show line ++ " at col " ++ show col) Right e -> return e quoteExprExp :: String -> ExpQ quoteExprExp s = do loc <- location let pos = (loc_filename loc, fst (loc_start loc), snd (loc_start loc)) parsed_expr <- parseExpr pos s dataToExpQ (const Nothing) parsed_expr