{-# LANGUAGE TemplateHaskell #-} module TemplateHaskell.Foo where import Language.Haskell.TH import Text.Printf -- | Report an error. -- -- >>> :set -XTemplateHaskell -- >>> $(logError "Something bad happened!") -- ERROR <interactive>: Something bad happened! logError :: String -> Q Exp logError :: String -> Q Exp logError String msg = do Loc loc <- Q Loc location let s :: String s = (String -> String -> String -> String forall r. PrintfType r => String -> r printf String "ERROR %s: %s" (Loc -> String loc_filename Loc loc) String msg) :: String [| putStrLn s |]