Je dois communiquer des informations à partir de scripts de compilation dans Template Haskell. Actuellement, les scripts de compilation conservent les informations dans l’environnement système. Je les ai donc simplement lues en utilisant System.Environment.getEnvironment
dans runIO
. Y a-t-il un meilleur moyen, comme de passer des arguments à ghc
(similaire à -D...
pour le pré-processeur C), ou peut-être quelque chose de spécialement conçu à cet effet dans TH?
Comme tant de personnes sont intéressées par la question, je vais append mon approche actuelle, peut-être que quelqu’un trouvera cela utile. Le meilleur moyen serait probablement que TH puisse lire les parameters -D
sur la ligne de commande du GHC, mais rien ne semble être mis en œuvre actuellement.
Un module simple permet à TH de lire un environnement de compilation. Une fonction d’assistance permet également de lire des fichiers; Par exemple, lisez le chemin d’un fichier de configuration à partir de l’environnement, puis lisez le fichier.
{-# LANGUAGE TemplateHaskell #-} module THEnv ( -- * Comstack-time configuration lookupComstackEnv , lookupComstackEnvExp , getComstackEnv , getComstackEnvExp , fileAsSsortingng ) where import Control.Monad import qualified Data.Text as T import qualified Data.Text.IO as T import Language.Haskell.TH import Language.Haskell.TH.Syntax (Lift(..)) import System.Environment (getEnvironment) -- Functions that work with comstack-time configuration -- | Looks up a comstack-time environment variable. lookupComstackEnv :: Ssortingng -> Q (Maybe Ssortingng) lookupComstackEnv key = lookup key `liftM` runIO getEnvironment -- | Looks up a comstack-time environment variable. The result is a TH -- expression of type @Maybe Ssortingng@. lookupComstackEnvExp :: Ssortingng -> Q Exp lookupComstackEnvExp = (`sigE` [t| Maybe Ssortingng |]) . lift <=< lookupCompileEnv -- We need to explicly type the result so that things like `print Nothing` -- work. -- | Looks up an compile-time environment variable and fail, if it's not -- present. getCompileEnv :: String -> Q Ssortingng getComstackEnv key = lookupComstackEnv key >>= maybe (fail $ "Environment variable " ++ key ++ " not defined") return -- | Looks up an comstack-time environment variable and fail, if it's not -- present. The result is a TH expression of type @Ssortingng@. getComstackEnvExp :: Ssortingng -> Q Exp getComstackEnvExp = lift <=< getCompileEnv -- | Loads the content of a file as a string constant expression. -- The given path is relative to the source directory. fileAsString :: FilePath -> Q Exp fileAsSsortingng = do -- addDependentFile path -- works only with template-haskell >= 2.7 ssortingngE . T.unpack . T.ssortingp <=< runIO . T.readFile
Il peut être utilisé comme ceci:
{-# LANGUAGE TemplateHaskell #-} import THEnv main = print $( lookupComstackEnvExp "DEBUG" )
Alors:
runhaskell Main.hs
imprime Nothing
; DEBUG="yes" runhaskell Main.hs
imprime Just "yes"
. Il semble que ce que vous essayez de faire ici , l’option -D dans ghc semble définir une variable de temps de compilation.
Ici, sur le même sujet, il y a une question qui semble également répondre à l’autre partie de votre question. D’après ce que je peux dire, pour faire une compilation conditionnelle, vous faites quelque chose comme:
#ifdef MACRO_NAME //Do stuff here #endif