Мне нужно сообщить какую-то информацию от компиляции скриптов в шаблон Хаскелл. В настоящее время скомпилировать скрипты хранить информацию в системе среде, так что я просто прочитать его с помощью системы.Среды.getEnvironmentзавернутый в runIO
. Есть ли лучший способ, как проходить некоторые аргументы с GHC
(аналог -Д
для C препроцессор), или, возможно, что-то специально для этой цели в ЧЕ?
Так как очень много людей интересует вопрос, Я'будете добавлять мой нынешний подход, возможно, кто-то найдет его полезным. Наверное, лучше всего было бы, если че может читать `-Д параметров с помощью GHC'командная строка s, но кажется, ничего подобного не реализуется в настоящее время.
Простой модуль позволяет че читать во время компиляции среды. Вспомогательная функция также позволяет читать файлы, например прочитать путь из файла конфигурации из окружающей среды и затем прочитать файл.
{-# LANGUAGE TemplateHaskell #-}
module THEnv
(
-- * Compile-time configuration
lookupCompileEnv
, lookupCompileEnvExp
, getCompileEnv
, getCompileEnvExp
, fileAsString
) 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 compile-time configuration
-- | Looks up a compile-time environment variable.
lookupCompileEnv :: String -> Q (Maybe String)
lookupCompileEnv key = lookup key `liftM` runIO getEnvironment
-- | Looks up a compile-time environment variable. The result is a TH
-- expression of type @Maybe String@.
lookupCompileEnvExp :: String -> Q Exp
lookupCompileEnvExp = (`sigE` [t| Maybe String |]) . 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 String
getCompileEnv key =
lookupCompileEnv key >>=
maybe (fail $ "Environment variable " ++ key ++ " not defined") return
-- | Looks up an compile-time environment variable and fail, if it's not
-- present. The result is a TH expression of type @String@.
getCompileEnvExp :: String -> Q Exp
getCompileEnvExp = 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
fileAsString = do
-- addDependentFile path -- works only with template-haskell >= 2.7
stringE . T.unpack . T.strip <=< runIO . T.readFile
Он может быть использован такой:
{-# LANGUAGE TemplateHaskell #-}
import THEnv
main = print $( lookupCompileEnvExp "DEBUG" )
Затем:
отпечатков
ничего`;Отладка="Да" и runhaskell Главная.УГ
отпечатки просто "Да" и
.Похоже, что вы пытаетесь сделать здесь, параметр-D в GHC, кажется, чтобы определить время компиляции переменной.
Здесь же, на тему вопрос, который, кажется, также отвечают на другие части вашего вопроса. От того, что я могу сказать, сделать условную компиляцию, вы делаете что-то вроде:
#ifdef MACRO_NAME
//Do stuff here
#endif