liboleg-2010.1.10.0: Data/Symbolic/TypedCodeAux.hs
{-# OPTIONS -fglasgow-exts #-}
{-# LANGUAGE TemplateHaskell #-}
-- | Obtain the Name that corresponds to a top-level (Prelude-level)
-- Haskell identifier.
-- Given an expression such as [e| (+) |] we return the expression
-- that is the application of mkNameG_v to the correct strings.
-- That expression, when spliced in, will compute exactly the same
-- name that corresponds to the one we started with, that is, (+).
-- Note that (+) was the identifier, not the name.
-- The result of splicing reifyName can be used in splices
-- (see the Diff.hs for examples).
-- We essentially apply the TH to itself and emulate more than one stage
-- of computation.
--
module Data.Symbolic.TypedCodeAux where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import Language.Haskell.TH.Ppr
reifyName :: Q Exp -> Q Exp
{- For GHC prior to 6.6, use the following code. TH has changed in
GHC 6.6
reifyName nameE = nameE >>=
\ (VarE (Name occname (NameG VarName mn))) ->
[e| mkNameG_v $(litE . stringL . modString $ mn)
$(litE . stringL . occString $ occname)|]
-}
reifyName nameE = nameE >>=
\ (VarE (Name occname (NameG VarName pn mn))) ->
[e| mkNameG_v
$(litE . stringL . pkgString $ pn)
$(litE . stringL . modString $ mn)
$(litE . stringL . occString $ occname)|]
{-
Remnants of early experiments
foo = $([e| (+) |] >>= \ (VarE name) -> global name)
-- foo1 = $([e| (+) |] >>= \ (VarE name) -> global $ mkName "GHC.Num.+")
foo1 = $([e| (+) |] >>= \ (VarE (Name occname (NameG VarName mn))) ->
[e| mkNameG_v $(litE . stringL . modString $ mn)
$(litE . stringL . occString $ occname)|])
-}