de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
Petr Pudlák
Petr Pudlák
Question

Bagaimana untuk benar berkomunikasi compile-time informasi untuk Template Haskell fungsi?

Saya perlu untuk mengkomunikasikan suatu informasi dari mengkompilasi script ke Template Haskell. Saat ini mengkompilasi script menjaga informasi dalam sistem lingkungan, sehingga aku hanya membacanya menggunakan Sistem.Lingkungan.getEnvironment dibungkus runIO. Apakah ada cara yang lebih baik, seperti melewati beberapa argumen untuk ghc (mirip dengan -D... untuk C pre-processor), atau mungkin sesuatu yang khusus dirancang untuk tujuan ini di TH?

69 2013-10-30T09:55:51+00:00 2
Pemrograman
haskell
compile-time
template-haskell
Petr Pudlák
Petr Pudlák
1 Januari 2014 в 5:05
2014-01-01T17:05:58+00:00
Lebih
Sumber
Sunting
#22664282

Karena begitu banyak orang yang tertarik pada pertanyaan, saya'll menambahkan pendekatan saat ini, mungkin seseorang akan menemukan itu berguna. Mungkin cara terbaik adalah jika TH diizinkan untuk membaca -D parameter pada GHC's command line, tapi tampaknya tidak ada yang seperti ini dilaksanakan saat ini.

Modul sederhana ini memungkinkan TH untuk membaca waktu kompilasi lingkungan. Fungsi pembantu juga memungkinkan untuk membaca file; misalnya membaca path dari file konfigurasi dari lingkungan dan kemudian baca file.

{-# 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 [email protected]
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 @[email protected]
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

Hal ini dapat digunakan seperti ini:

{-# LANGUAGE TemplateHaskell #-}
import THEnv
main = print $( lookupCompileEnvExp "DEBUG" )

Maka:

  • runhaskell Utama.hs cetak tidak Ada;
  • DEBUG="ya" runhaskell Utama.hs cetakan Hanya "ya".
13
0
 jaked122
jaked122
25 Desember 2013 в 9:24
2013-12-25T21:24:24+00:00
Lebih
Sumber
Sunting
#22664281

Sepertinya apa yang anda coba lakukan di sini, option-D di ghc tampaknya untuk menentukan waktu kompilasi variabel.

Di sini, pada subjek yang sama adalah pertanyaan yang tampaknya juga menjawab bagian lain dari pertanyaan anda. Dari apa yang saya tahu, untuk melakukan kompilasi bersyarat, anda melakukan sesuatu seperti:

    #ifdef MACRO_NAME
    //Do stuff here
    #endif
 Community
Community
Jawaban edit 23 Mei 2017 в 12:09
3
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 2 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi