2012-07-10 21 views
7

mam trywialne Szablon programu Haskell, który drukuje nazwę bieżącego modułu (główne, tutaj):Dlaczego TemplateHaskell powoduje, że GHC ładuje pakiety?

{-# LANGUAGE TemplateHaskell #-} 
module Main 
(main 
) where 

import Language.Haskell.TH 
import Language.Haskell.TH.Syntax 

modName ∷ String 
modName = $(fmap loc_module qLocation »= λmod → return (LitE (StringL mod))) 

main ∷ IO() 
main = putStrLn modName 

Kiedy skompilować ten, mam wczytywanie następujące komunikaty z GHC:

[email protected] ~/test/modname $ ghc --make Main 
[1 of 1] Compiling Main    (Main.hs, Main.o) 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Loading package array-0.4.0.0 ... linking ... done. 
Loading package deepseq-1.3.0.0 ... linking ... done. 
Loading package containers-0.4.2.1 ... linking ... done. 
Loading package pretty-1.1.1.0 ... linking ... done. 
Loading package template-haskell ... linking ... done. 
Linking Main ... 

Dlaczego ghc ładuje wszystkie te pakiety, gdy włączony jest szablon Haskell? Ilekroć buduję program, który używa szablonu Haskell, szczególnie takiego, który jest zbudowany na wiele pakietów, moje ostrzeżenia dotyczące kompilacji są przytłoczone tymi zbędnymi komunikatami "Ładowanie". Byłoby miło, gdybym mógł zatrzymać drukowanie wiadomości lub zatrzymać (niepotrzebne?) Ładowanie modułów w ogóle.

+0

'Language.Haskell.TH' jest w pakiecie' szablon haskell', która z kolei zależy od wszystkich innych te. Duh. –

+0

Szablon Haskell wykonuje ocenę w czasie kompilacji, więc moduły i pakiety potrzebne do uruchomienia kodu, który jest łączony w czasie kompilacji, muszą zostać załadowane. – kosmikus

Odpowiedz

7

Szablon Haskell działa w czasie kompilacji za pośrednictwem interpretera kodu bajtowego (GHCi). Wszystkie zależności pakietu, które masz - w czasie kompilacji - będą ładowane dynamicznie do GHC - w czasie kompilacji, aby można było wykonywać spawy.

Jedną z twoich zależności jest sama biblioteka szablonów Haskell, która z kolei zależy od większości podstawowych rzeczy.

4

można zapobiec „pakietu loading” linie przed wydrukowane przez przepuszczenie flagę -v0 do GHC. (To hamuje również „Kompilacja” i „Łączenie” linii, ale ostrzeżenia i błędy są nadal widoczne.)

Powiązane problemy