1 -----------------------------------------------------------------------------
3 -- (c) The University of Glasgow 2006
5 -- The purpose of this module is to transform an HsExpr into a CoreExpr which
6 -- when evaluated, returns a (Meta.Q Meta.Exp) computation analogous to the
7 -- input HsExpr. We do this in the DsM monad, which supplies access to
8 -- CoreExpr's of the "smart constructors" of the Meta.Exp datatype.
10 -- It also defines a bunch of knownKeyNames, in the same way as is done
11 -- in prelude/PrelNames. It's much more convenient to do it here, becuase
12 -- otherwise we have to recompile PrelNames whenever we add a Name, which is
13 -- a Royal Pain (triggers other recompilation).
14 -----------------------------------------------------------------------------
17 module DsMeta( dsBracket,
18 templateHaskellNames, qTyConName, nameTyConName,
19 liftName, expQTyConName, decQTyConName, typeQTyConName,
20 decTyConName, typeTyConName, mkNameG_dName, mkNameG_vName, mkNameG_tcName
23 #include "HsVersions.h"
25 import {-# SOURCE #-} DsExpr ( dsExpr )
31 import qualified Language.Haskell.TH as TH
36 -- To avoid clashes with DsMeta.varName we must make a local alias for
37 -- OccName.varName we do this by removing varName from the import of
38 -- OccName above, making a qualified instance of OccName and using
39 -- OccNameAlias.varName where varName ws previously used in this file.
40 import qualified OccName
64 -----------------------------------------------------------------------------
65 dsBracket :: HsBracket Name -> [PendingSplice] -> DsM CoreExpr
66 -- Returns a CoreExpr of type TH.ExpQ
67 -- The quoted thing is parameterised over Name, even though it has
68 -- been type checked. We don't want all those type decorations!
70 dsBracket brack splices
71 = dsExtendMetaEnv new_bit (do_brack brack)
73 new_bit = mkNameEnv [(n, Splice (unLoc e)) | (n,e) <- splices]
75 do_brack (VarBr n) = do { MkC e1 <- lookupOcc n ; return e1 }
76 do_brack (ExpBr e) = do { MkC e1 <- repLE e ; return e1 }
77 do_brack (PatBr p) = do { MkC p1 <- repLP p ; return p1 }
78 do_brack (TypBr t) = do { MkC t1 <- repLTy t ; return t1 }
79 do_brack (DecBr ds) = do { MkC ds1 <- repTopDs ds ; return ds1 }
81 {- -------------- Examples --------------------
85 gensym (unpackString "x"#) `bindQ` \ x1::String ->
86 lam (pvar x1) (var x1)
89 [| \x -> $(f [| x |]) |]
91 gensym (unpackString "x"#) `bindQ` \ x1::String ->
92 lam (pvar x1) (f (var x1))
96 -------------------------------------------------------
98 -------------------------------------------------------
100 repTopDs :: HsGroup Name -> DsM (Core (TH.Q [TH.Dec]))
102 = do { let { bndrs = map unLoc (groupBinders group) } ;
103 ss <- mkGenSyms bndrs ;
105 -- Bind all the names mainly to avoid repeated use of explicit strings.
107 -- do { t :: String <- genSym "T" ;
108 -- return (Data t [] ...more t's... }
109 -- The other important reason is that the output must mention
110 -- only "T", not "Foo:T" where Foo is the current module
113 decls <- addBinds ss (do {
114 val_ds <- rep_val_binds (hs_valds group) ;
115 tycl_ds <- mapM repTyClD (hs_tyclds group) ;
116 inst_ds <- mapM repInstD' (hs_instds group) ;
117 for_ds <- mapM repForD (hs_fords group) ;
119 return (de_loc $ sort_by_loc $ val_ds ++ catMaybes tycl_ds ++ inst_ds ++ for_ds) }) ;
121 decl_ty <- lookupType decQTyConName ;
122 let { core_list = coreList' decl_ty decls } ;
124 dec_ty <- lookupType decTyConName ;
125 q_decs <- repSequenceQ dec_ty core_list ;
127 wrapNongenSyms ss q_decs
128 -- Do *not* gensym top-level binders
131 groupBinders (HsGroup { hs_valds = val_decls, hs_tyclds = tycl_decls,
132 hs_fords = foreign_decls })
133 -- Collect the binders of a Group
134 = collectHsValBinders val_decls ++
135 [n | d <- tycl_decls, n <- tyClDeclNames (unLoc d)] ++
136 [n | L _ (ForeignImport n _ _) <- foreign_decls]
139 {- Note [Binders and occurrences]
140 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
141 When we desugar [d| data T = MkT |]
143 Data "T" [] [Con "MkT" []] []
145 Data "Foo:T" [] [Con "Foo:MkT" []] []
146 That is, the new data decl should fit into whatever new module it is
147 asked to fit in. We do *not* clone, though; no need for this:
154 then we must desugar to
155 foo = Data "Foo:T" [] [Con "Foo:MkT" []] []
157 So in repTopDs we bring the binders into scope with mkGenSyms and addBinds.
158 And we use lookupOcc, rather than lookupBinder
159 in repTyClD and repC.
163 repTyClD :: LTyClDecl Name -> DsM (Maybe (SrcSpan, Core TH.DecQ))
165 repTyClD (L loc (TyData { tcdND = DataType, tcdCtxt = cxt,
166 tcdLName = tc, tcdTyVars = tvs,
167 tcdCons = cons, tcdDerivs = mb_derivs }))
168 = do { tc1 <- lookupLOcc tc ; -- See note [Binders and occurrences]
169 dec <- addTyVarBinds tvs $ \bndrs -> do {
170 cxt1 <- repLContext cxt ;
171 cons1 <- mapM repC cons ;
172 cons2 <- coreList conQTyConName cons1 ;
173 derivs1 <- repDerivs mb_derivs ;
174 bndrs1 <- coreList nameTyConName bndrs ;
175 repData cxt1 tc1 bndrs1 cons2 derivs1 } ;
176 return $ Just (loc, dec) }
178 repTyClD (L loc (TyData { tcdND = NewType, tcdCtxt = cxt,
179 tcdLName = tc, tcdTyVars = tvs,
180 tcdCons = [con], tcdDerivs = mb_derivs }))
181 = do { tc1 <- lookupLOcc tc ; -- See note [Binders and occurrences]
182 dec <- addTyVarBinds tvs $ \bndrs -> do {
183 cxt1 <- repLContext cxt ;
185 derivs1 <- repDerivs mb_derivs ;
186 bndrs1 <- coreList nameTyConName bndrs ;
187 repNewtype cxt1 tc1 bndrs1 con1 derivs1 } ;
188 return $ Just (loc, dec) }
190 repTyClD (L loc (TySynonym { tcdLName = tc, tcdTyVars = tvs, tcdSynRhs = ty }))
191 = do { tc1 <- lookupLOcc tc ; -- See note [Binders and occurrences]
192 dec <- addTyVarBinds tvs $ \bndrs -> do {
194 bndrs1 <- coreList nameTyConName bndrs ;
195 repTySyn tc1 bndrs1 ty1 } ;
196 return (Just (loc, dec)) }
198 repTyClD (L loc (ClassDecl { tcdCtxt = cxt, tcdLName = cls,
201 tcdSigs = sigs, tcdMeths = meth_binds }))
202 = do { cls1 <- lookupLOcc cls ; -- See note [Binders and occurrences]
203 dec <- addTyVarBinds tvs $ \bndrs -> do {
204 cxt1 <- repLContext cxt ;
205 sigs1 <- rep_sigs sigs ;
206 binds1 <- rep_binds meth_binds ;
207 fds1 <- repLFunDeps fds;
208 decls1 <- coreList decQTyConName (sigs1 ++ binds1) ;
209 bndrs1 <- coreList nameTyConName bndrs ;
210 repClass cxt1 cls1 bndrs1 fds1 decls1 } ;
211 return $ Just (loc, dec) }
214 repTyClD (L loc d) = putSrcSpanDs loc $
215 do { warnDs (hang ds_msg 4 (ppr d))
220 repLFunDeps :: [Located (FunDep Name)] -> DsM (Core [TH.FunDep])
221 repLFunDeps fds = do fds' <- mapM repLFunDep fds
222 fdList <- coreList funDepTyConName fds'
225 repLFunDep :: Located (FunDep Name) -> DsM (Core TH.FunDep)
226 repLFunDep (L _ (xs, ys)) = do xs' <- mapM lookupBinder xs
227 ys' <- mapM lookupBinder ys
228 xs_list <- coreList nameTyConName xs'
229 ys_list <- coreList nameTyConName ys'
230 repFunDep xs_list ys_list
232 repInstD' (L loc (InstDecl ty binds _ _)) -- Ignore user pragmas for now
233 = do { i <- addTyVarBinds tvs $ \tv_bndrs ->
234 -- We must bring the type variables into scope, so their occurrences
235 -- don't fail, even though the binders don't appear in the resulting
237 do { cxt1 <- repContext cxt
238 ; inst_ty1 <- repPred (HsClassP cls tys)
239 ; ss <- mkGenSyms (collectHsBindBinders binds)
240 ; binds1 <- addBinds ss (rep_binds binds)
241 ; decls1 <- coreList decQTyConName binds1
242 ; decls2 <- wrapNongenSyms ss decls1
243 -- wrapNonGenSyms: do not clone the class op names!
244 -- They must be called 'op' etc, not 'op34'
245 ; repInst cxt1 inst_ty1 decls2 }
249 (tvs, cxt, cls, tys) = splitHsInstDeclTy (unLoc ty)
251 repForD :: Located (ForeignDecl Name) -> DsM (SrcSpan, Core TH.DecQ)
252 repForD (L loc (ForeignImport name typ (CImport cc s ch cn cis)))
253 = do MkC name' <- lookupLOcc name
254 MkC typ' <- repLTy typ
255 MkC cc' <- repCCallConv cc
256 MkC s' <- repSafety s
257 cis' <- conv_cimportspec cis
258 MkC str <- coreStringLit $ static
259 ++ unpackFS ch ++ " "
260 ++ unpackFS cn ++ " "
262 dec <- rep2 forImpDName [cc', s', str, name', typ']
265 conv_cimportspec (CLabel cls) = notHandled "Foreign label" (doubleQuotes (ppr cls))
266 conv_cimportspec (CFunction DynamicTarget) = return "dynamic"
267 conv_cimportspec (CFunction (StaticTarget fs)) = return (unpackFS fs)
268 conv_cimportspec CWrapper = return "wrapper"
270 CFunction (StaticTarget _) -> "static "
272 repForD decl = notHandled "Foreign declaration" (ppr decl)
274 repCCallConv :: CCallConv -> DsM (Core TH.Callconv)
275 repCCallConv CCallConv = rep2 cCallName []
276 repCCallConv StdCallConv = rep2 stdCallName []
278 repSafety :: Safety -> DsM (Core TH.Safety)
279 repSafety PlayRisky = rep2 unsafeName []
280 repSafety (PlaySafe False) = rep2 safeName []
281 repSafety (PlaySafe True) = rep2 threadsafeName []
283 ds_msg = ptext SLIT("Cannot desugar this Template Haskell declaration:")
285 -------------------------------------------------------
287 -------------------------------------------------------
289 repC :: LConDecl Name -> DsM (Core TH.ConQ)
290 repC (L loc (ConDecl con expl [] (L _ []) details ResTyH98 _))
291 = do { con1 <- lookupLOcc con ; -- See note [Binders and occurrences]
292 repConstr con1 details }
293 repC (L loc (ConDecl con expl tvs (L cloc ctxt) details ResTyH98 doc))
294 = do { addTyVarBinds tvs $ \bndrs -> do {
295 c' <- repC (L loc (ConDecl con expl [] (L cloc []) details ResTyH98 doc));
296 ctxt' <- repContext ctxt;
297 bndrs' <- coreList nameTyConName bndrs;
298 rep2 forallCName [unC bndrs', unC ctxt', unC c']
301 repC (L loc con_decl) -- GADTs
303 notHandled "GADT declaration" (ppr con_decl)
305 repBangTy :: LBangType Name -> DsM (Core (TH.StrictTypeQ))
309 rep2 strictTypeName [s, t]
311 (str, ty') = case ty of
312 L _ (HsBangTy _ ty) -> (isStrictName, ty)
313 other -> (notStrictName, ty)
315 -------------------------------------------------------
317 -------------------------------------------------------
319 repDerivs :: Maybe [LHsType Name] -> DsM (Core [TH.Name])
320 repDerivs Nothing = coreList nameTyConName []
321 repDerivs (Just ctxt)
322 = do { strs <- mapM rep_deriv ctxt ;
323 coreList nameTyConName strs }
325 rep_deriv :: LHsType Name -> DsM (Core TH.Name)
326 -- Deriving clauses must have the simple H98 form
327 rep_deriv (L _ (HsPredTy (HsClassP cls []))) = lookupOcc cls
328 rep_deriv other = notHandled "Non-H98 deriving clause" (ppr other)
331 -------------------------------------------------------
332 -- Signatures in a class decl, or a group of bindings
333 -------------------------------------------------------
335 rep_sigs :: [LSig Name] -> DsM [Core TH.DecQ]
336 rep_sigs sigs = do locs_cores <- rep_sigs' sigs
337 return $ de_loc $ sort_by_loc locs_cores
339 rep_sigs' :: [LSig Name] -> DsM [(SrcSpan, Core TH.DecQ)]
340 -- We silently ignore ones we don't recognise
341 rep_sigs' sigs = do { sigs1 <- mapM rep_sig sigs ;
342 return (concat sigs1) }
344 rep_sig :: LSig Name -> DsM [(SrcSpan, Core TH.DecQ)]
346 -- Empty => Too hard, signature ignored
347 rep_sig (L loc (TypeSig nm ty)) = rep_proto nm ty loc
348 rep_sig other = return []
350 rep_proto :: Located Name -> LHsType Name -> SrcSpan -> DsM [(SrcSpan, Core TH.DecQ)]
351 rep_proto nm ty loc = do { nm1 <- lookupLOcc nm ;
353 sig <- repProto nm1 ty1 ;
354 return [(loc, sig)] }
357 -------------------------------------------------------
359 -------------------------------------------------------
361 -- gensym a list of type variables and enter them into the meta environment;
362 -- the computations passed as the second argument is executed in that extended
363 -- meta environment and gets the *new* names on Core-level as an argument
365 addTyVarBinds :: [LHsTyVarBndr Name] -- the binders to be added
366 -> ([Core TH.Name] -> DsM (Core (TH.Q a))) -- action in the ext env
367 -> DsM (Core (TH.Q a))
368 addTyVarBinds tvs m =
370 let names = map (hsTyVarName.unLoc) tvs
371 freshNames <- mkGenSyms names
372 term <- addBinds freshNames $ do
373 bndrs <- mapM lookupBinder names
375 wrapGenSyns freshNames term
377 -- represent a type context
379 repLContext :: LHsContext Name -> DsM (Core TH.CxtQ)
380 repLContext (L _ ctxt) = repContext ctxt
382 repContext :: HsContext Name -> DsM (Core TH.CxtQ)
384 preds <- mapM repLPred ctxt
385 predList <- coreList typeQTyConName preds
388 -- represent a type predicate
390 repLPred :: LHsPred Name -> DsM (Core TH.TypeQ)
391 repLPred (L _ p) = repPred p
393 repPred :: HsPred Name -> DsM (Core TH.TypeQ)
394 repPred (HsClassP cls tys) = do
395 tcon <- repTy (HsTyVar cls)
398 repPred p@(HsEqualP _ _) = notHandled "Equational constraint" (ppr p)
399 repPred p@(HsIParam _ _) = notHandled "Implicit parameter constraint" (ppr p)
401 -- yield the representation of a list of types
403 repLTys :: [LHsType Name] -> DsM [Core TH.TypeQ]
404 repLTys tys = mapM repLTy tys
408 repLTy :: LHsType Name -> DsM (Core TH.TypeQ)
409 repLTy (L _ ty) = repTy ty
411 repTy :: HsType Name -> DsM (Core TH.TypeQ)
412 repTy (HsForAllTy _ tvs ctxt ty) =
413 addTyVarBinds tvs $ \bndrs -> do
414 ctxt1 <- repLContext ctxt
416 bndrs1 <- coreList nameTyConName bndrs
417 repTForall bndrs1 ctxt1 ty1
420 | isTvOcc (nameOccName n) = do
421 tv1 <- lookupBinder n
426 repTy (HsAppTy f a) = do
430 repTy (HsFunTy f a) = do
433 tcon <- repArrowTyCon
434 repTapps tcon [f1, a1]
435 repTy (HsListTy t) = do
439 repTy (HsPArrTy t) = do
441 tcon <- repTy (HsTyVar (tyConName parrTyCon))
443 repTy (HsTupleTy tc tys) = do
445 tcon <- repTupleTyCon (length tys)
447 repTy (HsOpTy ty1 n ty2) = repLTy ((nlHsTyVar (unLoc n) `nlHsAppTy` ty1)
449 repTy (HsParTy t) = repLTy t
450 repTy (HsPredTy pred) = repPred pred
451 repTy ty@(HsNumTy _) = notHandled "Number types (for generics)" (ppr ty)
452 repTy ty = notHandled "Exotic form of type" (ppr ty)
455 -----------------------------------------------------------------------------
457 -----------------------------------------------------------------------------
459 repLEs :: [LHsExpr Name] -> DsM (Core [TH.ExpQ])
460 repLEs es = do { es' <- mapM repLE es ;
461 coreList expQTyConName es' }
463 -- FIXME: some of these panics should be converted into proper error messages
464 -- unless we can make sure that constructs, which are plainly not
465 -- supported in TH already lead to error messages at an earlier stage
466 repLE :: LHsExpr Name -> DsM (Core TH.ExpQ)
467 repLE (L loc e) = putSrcSpanDs loc (repE e)
469 repE :: HsExpr Name -> DsM (Core TH.ExpQ)
471 do { mb_val <- dsLookupMetaEnv x
473 Nothing -> do { str <- globalVar x
474 ; repVarOrCon x str }
475 Just (Bound y) -> repVarOrCon x (coreVar y)
476 Just (Splice e) -> do { e' <- dsExpr e
477 ; return (MkC e') } }
478 repE e@(HsIPVar x) = notHandled "Implicit parameters" (ppr e)
480 -- Remember, we're desugaring renamer output here, so
481 -- HsOverlit can definitely occur
482 repE (HsOverLit l) = do { a <- repOverloadedLiteral l; repLit a }
483 repE (HsLit l) = do { a <- repLiteral l; repLit a }
484 repE (HsLam (MatchGroup [m] _)) = repLambda m
485 repE (HsApp x y) = do {a <- repLE x; b <- repLE y; repApp a b}
487 repE (OpApp e1 op fix e2) =
488 do { arg1 <- repLE e1;
491 repInfixApp arg1 the_op arg2 }
492 repE (NegApp x nm) = do
494 negateVar <- lookupOcc negateName >>= repVar
496 repE (HsPar x) = repLE x
497 repE (SectionL x y) = do { a <- repLE x; b <- repLE y; repSectionL a b }
498 repE (SectionR x y) = do { a <- repLE x; b <- repLE y; repSectionR a b }
499 repE (HsCase e (MatchGroup ms _)) = do { arg <- repLE e
500 ; ms2 <- mapM repMatchTup ms
501 ; repCaseE arg (nonEmptyCoreList ms2) }
502 repE (HsIf x y z) = do
507 repE (HsLet bs e) = do { (ss,ds) <- repBinds bs
508 ; e2 <- addBinds ss (repLE e)
511 -- FIXME: I haven't got the types here right yet
512 repE (HsDo DoExpr sts body ty)
513 = do { (ss,zs) <- repLSts sts;
514 body' <- addBinds ss $ repLE body;
515 ret <- repNoBindSt body';
516 e <- repDoE (nonEmptyCoreList (zs ++ [ret]));
518 repE (HsDo ListComp sts body ty)
519 = do { (ss,zs) <- repLSts sts;
520 body' <- addBinds ss $ repLE body;
521 ret <- repNoBindSt body';
522 e <- repComp (nonEmptyCoreList (zs ++ [ret]));
524 repE e@(HsDo _ _ _ _) = notHandled "mdo and [: :]" (ppr e)
525 repE (ExplicitList ty es) = do { xs <- repLEs es; repListExp xs }
526 repE e@(ExplicitPArr ty es) = notHandled "Parallel arrays" (ppr e)
527 repE e@(ExplicitTuple es boxed)
528 | isBoxed boxed = do { xs <- repLEs es; repTup xs }
529 | otherwise = notHandled "Unboxed tuples" (ppr e)
530 repE (RecordCon c _ flds)
531 = do { x <- lookupLOcc c;
532 fs <- repFields flds;
534 repE (RecordUpd e flds _ _ _)
536 fs <- repFields flds;
539 repE (ExprWithTySig e ty) = do { e1 <- repLE e; t1 <- repLTy ty; repSigExp e1 t1 }
540 repE (ArithSeq _ aseq) =
542 From e -> do { ds1 <- repLE e; repFrom ds1 }
551 FromThenTo e1 e2 e3 -> do
555 repFromThenTo ds1 ds2 ds3
556 repE (HsSpliceE (HsSplice n _))
557 = do { mb_val <- dsLookupMetaEnv n
559 Just (Splice e) -> do { e' <- dsExpr e
561 other -> pprPanic "HsSplice" (ppr n) }
562 -- Should not happen; statically checked
564 repE e@(PArrSeq {}) = notHandled "Parallel arrays" (ppr e)
565 repE e@(HsCoreAnn {}) = notHandled "Core annotations" (ppr e)
566 repE e@(HsSCC {}) = notHandled "Cost centres" (ppr e)
567 repE e@(HsTickPragma {}) = notHandled "Tick Pragma" (ppr e)
568 repE e@(HsBracketOut {}) = notHandled "TH brackets" (ppr e)
569 repE e = notHandled "Expression form" (ppr e)
571 -----------------------------------------------------------------------------
572 -- Building representations of auxillary structures like Match, Clause, Stmt,
574 repMatchTup :: LMatch Name -> DsM (Core TH.MatchQ)
575 repMatchTup (L _ (Match [p] ty (GRHSs guards wheres))) =
576 do { ss1 <- mkGenSyms (collectPatBinders p)
577 ; addBinds ss1 $ do {
579 ; (ss2,ds) <- repBinds wheres
580 ; addBinds ss2 $ do {
581 ; gs <- repGuards guards
582 ; match <- repMatch p1 gs ds
583 ; wrapGenSyns (ss1++ss2) match }}}
584 repMatchTup other = panic "repMatchTup: case alt with more than one arg"
586 repClauseTup :: LMatch Name -> DsM (Core TH.ClauseQ)
587 repClauseTup (L _ (Match ps ty (GRHSs guards wheres))) =
588 do { ss1 <- mkGenSyms (collectPatsBinders ps)
589 ; addBinds ss1 $ do {
591 ; (ss2,ds) <- repBinds wheres
592 ; addBinds ss2 $ do {
593 gs <- repGuards guards
594 ; clause <- repClause ps1 gs ds
595 ; wrapGenSyns (ss1++ss2) clause }}}
597 repGuards :: [LGRHS Name] -> DsM (Core TH.BodyQ)
598 repGuards [L _ (GRHS [] e)]
599 = do {a <- repLE e; repNormal a }
601 = do { zs <- mapM process other;
602 let {(xs, ys) = unzip zs};
603 gd <- repGuarded (nonEmptyCoreList ys);
604 wrapGenSyns (concat xs) gd }
606 process :: LGRHS Name -> DsM ([GenSymBind], (Core (TH.Q (TH.Guard, TH.Exp))))
607 process (L _ (GRHS [L _ (ExprStmt e1 _ _)] e2))
608 = do { x <- repLNormalGE e1 e2;
610 process (L _ (GRHS ss rhs))
611 = do (gs, ss') <- repLSts ss
612 rhs' <- addBinds gs $ repLE rhs
613 g <- repPatGE (nonEmptyCoreList ss') rhs'
616 repFields :: HsRecordBinds Name -> DsM (Core [TH.Q TH.FieldExp])
617 repFields (HsRecFields { rec_flds = flds })
618 = do { fnames <- mapM lookupLOcc (map hsRecFieldId flds)
619 ; es <- mapM repLE (map hsRecFieldArg flds)
620 ; fs <- zipWithM repFieldExp fnames es
621 ; coreList fieldExpQTyConName fs }
624 -----------------------------------------------------------------------------
625 -- Representing Stmt's is tricky, especially if bound variables
626 -- shadow each other. Consider: [| do { x <- f 1; x <- f x; g x } |]
627 -- First gensym new names for every variable in any of the patterns.
628 -- both static (x'1 and x'2), and dynamic ((gensym "x") and (gensym "y"))
629 -- if variables didn't shaddow, the static gensym wouldn't be necessary
630 -- and we could reuse the original names (x and x).
632 -- do { x'1 <- gensym "x"
633 -- ; x'2 <- gensym "x"
634 -- ; doE [ BindSt (pvar x'1) [| f 1 |]
635 -- , BindSt (pvar x'2) [| f x |]
636 -- , NoBindSt [| g x |]
640 -- The strategy is to translate a whole list of do-bindings by building a
641 -- bigger environment, and a bigger set of meta bindings
642 -- (like: x'1 <- gensym "x" ) and then combining these with the translations
643 -- of the expressions within the Do
645 -----------------------------------------------------------------------------
646 -- The helper function repSts computes the translation of each sub expression
647 -- and a bunch of prefix bindings denoting the dynamic renaming.
649 repLSts :: [LStmt Name] -> DsM ([GenSymBind], [Core TH.StmtQ])
650 repLSts stmts = repSts (map unLoc stmts)
652 repSts :: [Stmt Name] -> DsM ([GenSymBind], [Core TH.StmtQ])
653 repSts (BindStmt p e _ _ : ss) =
655 ; ss1 <- mkGenSyms (collectPatBinders p)
656 ; addBinds ss1 $ do {
658 ; (ss2,zs) <- repSts ss
659 ; z <- repBindSt p1 e2
660 ; return (ss1++ss2, z : zs) }}
661 repSts (LetStmt bs : ss) =
662 do { (ss1,ds) <- repBinds bs
664 ; (ss2,zs) <- addBinds ss1 (repSts ss)
665 ; return (ss1++ss2, z : zs) }
666 repSts (ExprStmt e _ _ : ss) =
668 ; z <- repNoBindSt e2
669 ; (ss2,zs) <- repSts ss
670 ; return (ss2, z : zs) }
671 repSts [] = return ([],[])
672 repSts other = notHandled "Exotic statement" (ppr other)
675 -----------------------------------------------------------
677 -----------------------------------------------------------
679 repBinds :: HsLocalBinds Name -> DsM ([GenSymBind], Core [TH.DecQ])
680 repBinds EmptyLocalBinds
681 = do { core_list <- coreList decQTyConName []
682 ; return ([], core_list) }
684 repBinds b@(HsIPBinds _) = notHandled "Implicit parameters" (ppr b)
686 repBinds (HsValBinds decs)
687 = do { let { bndrs = map unLoc (collectHsValBinders decs) }
688 -- No need to worrry about detailed scopes within
689 -- the binding group, because we are talking Names
690 -- here, so we can safely treat it as a mutually
692 ; ss <- mkGenSyms bndrs
693 ; prs <- addBinds ss (rep_val_binds decs)
694 ; core_list <- coreList decQTyConName
695 (de_loc (sort_by_loc prs))
696 ; return (ss, core_list) }
698 rep_val_binds :: HsValBinds Name -> DsM [(SrcSpan, Core TH.DecQ)]
699 -- Assumes: all the binders of the binding are alrady in the meta-env
700 rep_val_binds (ValBindsOut binds sigs)
701 = do { core1 <- rep_binds' (unionManyBags (map snd binds))
702 ; core2 <- rep_sigs' sigs
703 ; return (core1 ++ core2) }
704 rep_val_binds (ValBindsIn binds sigs)
705 = panic "rep_val_binds: ValBindsIn"
707 rep_binds :: LHsBinds Name -> DsM [Core TH.DecQ]
708 rep_binds binds = do { binds_w_locs <- rep_binds' binds
709 ; return (de_loc (sort_by_loc binds_w_locs)) }
711 rep_binds' :: LHsBinds Name -> DsM [(SrcSpan, Core TH.DecQ)]
712 rep_binds' binds = mapM rep_bind (bagToList binds)
714 rep_bind :: LHsBind Name -> DsM (SrcSpan, Core TH.DecQ)
715 -- Assumes: all the binders of the binding are alrady in the meta-env
717 -- Note GHC treats declarations of a variable (not a pattern)
718 -- e.g. x = g 5 as a Fun MonoBinds. This is indicated by a single match
719 -- with an empty list of patterns
720 rep_bind (L loc (FunBind { fun_id = fn,
721 fun_matches = MatchGroup [L _ (Match [] ty (GRHSs guards wheres))] _ }))
722 = do { (ss,wherecore) <- repBinds wheres
723 ; guardcore <- addBinds ss (repGuards guards)
724 ; fn' <- lookupLBinder fn
726 ; ans <- repVal p guardcore wherecore
727 ; ans' <- wrapGenSyns ss ans
728 ; return (loc, ans') }
730 rep_bind (L loc (FunBind { fun_id = fn, fun_matches = MatchGroup ms _ }))
731 = do { ms1 <- mapM repClauseTup ms
732 ; fn' <- lookupLBinder fn
733 ; ans <- repFun fn' (nonEmptyCoreList ms1)
734 ; return (loc, ans) }
736 rep_bind (L loc (PatBind { pat_lhs = pat, pat_rhs = GRHSs guards wheres }))
737 = do { patcore <- repLP pat
738 ; (ss,wherecore) <- repBinds wheres
739 ; guardcore <- addBinds ss (repGuards guards)
740 ; ans <- repVal patcore guardcore wherecore
741 ; ans' <- wrapGenSyns ss ans
742 ; return (loc, ans') }
744 rep_bind (L loc (VarBind { var_id = v, var_rhs = e}))
745 = do { v' <- lookupBinder v
748 ; patcore <- repPvar v'
749 ; empty_decls <- coreList decQTyConName []
750 ; ans <- repVal patcore x empty_decls
751 ; return (srcLocSpan (getSrcLoc v), ans) }
753 rep_bind other = panic "rep_bind: AbsBinds"
755 -----------------------------------------------------------------------------
756 -- Since everything in a Bind is mutually recursive we need rename all
757 -- all the variables simultaneously. For example:
758 -- [| AndMonoBinds (f x = x + g 2) (g x = f 1 + 2) |] would translate to
759 -- do { f'1 <- gensym "f"
760 -- ; g'2 <- gensym "g"
761 -- ; [ do { x'3 <- gensym "x"; fun f'1 [pvar x'3] [| x + g2 |]},
762 -- do { x'4 <- gensym "x"; fun g'2 [pvar x'4] [| f 1 + 2 |]}
764 -- This requires collecting the bindings (f'1 <- gensym "f"), and the
765 -- environment ( f |-> f'1 ) from each binding, and then unioning them
766 -- together. As we do this we collect GenSymBinds's which represent the renamed
767 -- variables bound by the Bindings. In order not to lose track of these
768 -- representations we build a shadow datatype MB with the same structure as
769 -- MonoBinds, but which has slots for the representations
772 -----------------------------------------------------------------------------
773 -- GHC allows a more general form of lambda abstraction than specified
774 -- by Haskell 98. In particular it allows guarded lambda's like :
775 -- (\ x | even x -> 0 | odd x -> 1) at the moment we can't represent this in
776 -- Haskell Template's Meta.Exp type so we punt if it isn't a simple thing like
777 -- (\ p1 .. pn -> exp) by causing an error.
779 repLambda :: LMatch Name -> DsM (Core TH.ExpQ)
780 repLambda (L _ (Match ps _ (GRHSs [L _ (GRHS [] e)] EmptyLocalBinds)))
781 = do { let bndrs = collectPatsBinders ps ;
782 ; ss <- mkGenSyms bndrs
783 ; lam <- addBinds ss (
784 do { xs <- repLPs ps; body <- repLE e; repLam xs body })
785 ; wrapGenSyns ss lam }
787 repLambda (L _ m) = notHandled "Guarded labmdas" (pprMatch LambdaExpr m)
790 -----------------------------------------------------------------------------
792 -- repP deals with patterns. It assumes that we have already
793 -- walked over the pattern(s) once to collect the binders, and
794 -- have extended the environment. So every pattern-bound
795 -- variable should already appear in the environment.
797 -- Process a list of patterns
798 repLPs :: [LPat Name] -> DsM (Core [TH.PatQ])
799 repLPs ps = do { ps' <- mapM repLP ps ;
800 coreList patQTyConName ps' }
802 repLP :: LPat Name -> DsM (Core TH.PatQ)
803 repLP (L _ p) = repP p
805 repP :: Pat Name -> DsM (Core TH.PatQ)
806 repP (WildPat _) = repPwild
807 repP (LitPat l) = do { l2 <- repLiteral l; repPlit l2 }
808 repP (VarPat x) = do { x' <- lookupBinder x; repPvar x' }
809 repP (LazyPat p) = do { p1 <- repLP p; repPtilde p1 }
810 repP (AsPat x p) = do { x' <- lookupLBinder x; p1 <- repLP p; repPaspat x' p1 }
811 repP (ParPat p) = repLP p
812 repP (ListPat ps _) = do { qs <- repLPs ps; repPlist qs }
813 repP (TuplePat ps _ _) = do { qs <- repLPs ps; repPtup qs }
814 repP (ConPatIn dc details)
815 = do { con_str <- lookupLOcc dc
817 PrefixCon ps -> do { qs <- repLPs ps; repPcon con_str qs }
818 RecCon rec -> do { let flds = rec_flds rec
819 ; vs <- sequence $ map lookupLOcc (map hsRecFieldId flds)
820 ; ps <- sequence $ map repLP (map hsRecFieldArg flds)
821 ; fps <- zipWithM (\x y -> rep2 fieldPatName [unC x,unC y]) vs ps
822 ; fps' <- coreList fieldPatQTyConName fps
823 ; repPrec con_str fps' }
824 InfixCon p1 p2 -> do { p1' <- repLP p1;
826 repPinfix p1' con_str p2' }
828 repP (NPat l Nothing _ _) = do { a <- repOverloadedLiteral l; repPlit a }
829 repP p@(NPat l (Just _) _ _) = notHandled "Negative overloaded patterns" (ppr p)
830 repP p@(SigPatIn {}) = notHandled "Type signatures in patterns" (ppr p)
831 -- The problem is to do with scoped type variables.
832 -- To implement them, we have to implement the scoping rules
833 -- here in DsMeta, and I don't want to do that today!
834 -- do { p' <- repLP p; t' <- repLTy t; repPsig p' t' }
835 -- repPsig :: Core TH.PatQ -> Core TH.TypeQ -> DsM (Core TH.PatQ)
836 -- repPsig (MkC p) (MkC t) = rep2 sigPName [p, t]
838 repP other = notHandled "Exotic pattern" (ppr other)
840 ----------------------------------------------------------
841 -- Declaration ordering helpers
843 sort_by_loc :: [(SrcSpan, a)] -> [(SrcSpan, a)]
844 sort_by_loc xs = sortBy comp xs
845 where comp x y = compare (fst x) (fst y)
847 de_loc :: [(a, b)] -> [b]
850 ----------------------------------------------------------
851 -- The meta-environment
853 -- A name/identifier association for fresh names of locally bound entities
854 type GenSymBind = (Name, Id) -- Gensym the string and bind it to the Id
855 -- I.e. (x, x_id) means
856 -- let x_id = gensym "x" in ...
858 -- Generate a fresh name for a locally bound entity
860 mkGenSyms :: [Name] -> DsM [GenSymBind]
861 -- We can use the existing name. For example:
862 -- [| \x_77 -> x_77 + x_77 |]
864 -- do { x_77 <- genSym "x"; .... }
865 -- We use the same x_77 in the desugared program, but with the type Bndr
868 -- We do make it an Internal name, though (hence localiseName)
870 -- Nevertheless, it's monadic because we have to generate nameTy
871 mkGenSyms ns = do { var_ty <- lookupType nameTyConName
872 ; return [(nm, mkLocalId (localiseName nm) var_ty) | nm <- ns] }
875 addBinds :: [GenSymBind] -> DsM a -> DsM a
876 -- Add a list of fresh names for locally bound entities to the
877 -- meta environment (which is part of the state carried around
878 -- by the desugarer monad)
879 addBinds bs m = dsExtendMetaEnv (mkNameEnv [(n,Bound id) | (n,id) <- bs]) m
881 -- Look up a locally bound name
883 lookupLBinder :: Located Name -> DsM (Core TH.Name)
884 lookupLBinder (L _ n) = lookupBinder n
886 lookupBinder :: Name -> DsM (Core TH.Name)
888 = do { mb_val <- dsLookupMetaEnv n;
890 Just (Bound x) -> return (coreVar x)
891 other -> failWithDs msg }
893 msg = ptext SLIT("DsMeta: failed binder lookup when desugaring a TH bracket:") <+> ppr n
895 -- Look up a name that is either locally bound or a global name
897 -- * If it is a global name, generate the "original name" representation (ie,
898 -- the <module>:<name> form) for the associated entity
900 lookupLOcc :: Located Name -> DsM (Core TH.Name)
901 -- Lookup an occurrence; it can't be a splice.
902 -- Use the in-scope bindings if they exist
903 lookupLOcc (L _ n) = lookupOcc n
905 lookupOcc :: Name -> DsM (Core TH.Name)
907 = do { mb_val <- dsLookupMetaEnv n ;
909 Nothing -> globalVar n
910 Just (Bound x) -> return (coreVar x)
911 Just (Splice _) -> pprPanic "repE:lookupOcc" (ppr n)
914 globalVar :: Name -> DsM (Core TH.Name)
915 -- Not bound by the meta-env
916 -- Could be top-level; or could be local
917 -- f x = $(g [| x |])
918 -- Here the x will be local
920 | isExternalName name
921 = do { MkC mod <- coreStringLit name_mod
922 ; MkC pkg <- coreStringLit name_pkg
923 ; MkC occ <- occNameLit name
924 ; rep2 mk_varg [pkg,mod,occ] }
926 = do { MkC occ <- occNameLit name
927 ; MkC uni <- coreIntLit (getKey (getUnique name))
928 ; rep2 mkNameLName [occ,uni] }
930 mod = nameModule name
931 name_mod = moduleNameString (moduleName mod)
932 name_pkg = packageIdString (modulePackageId mod)
933 name_occ = nameOccName name
934 mk_varg | OccName.isDataOcc name_occ = mkNameG_dName
935 | OccName.isVarOcc name_occ = mkNameG_vName
936 | OccName.isTcOcc name_occ = mkNameG_tcName
937 | otherwise = pprPanic "DsMeta.globalVar" (ppr name)
939 lookupType :: Name -- Name of type constructor (e.g. TH.ExpQ)
940 -> DsM Type -- The type
941 lookupType tc_name = do { tc <- dsLookupTyCon tc_name ;
942 return (mkTyConApp tc []) }
944 wrapGenSyns :: [GenSymBind]
945 -> Core (TH.Q a) -> DsM (Core (TH.Q a))
946 -- wrapGenSyns [(nm1,id1), (nm2,id2)] y
947 -- --> bindQ (gensym nm1) (\ id1 ->
948 -- bindQ (gensym nm2 (\ id2 ->
951 wrapGenSyns binds body@(MkC b)
952 = do { var_ty <- lookupType nameTyConName
955 [elt_ty] = tcTyConAppArgs (exprType b)
956 -- b :: Q a, so we can get the type 'a' by looking at the
957 -- argument type. NB: this relies on Q being a data/newtype,
958 -- not a type synonym
960 go var_ty [] = return body
961 go var_ty ((name,id) : binds)
962 = do { MkC body' <- go var_ty binds
963 ; lit_str <- occNameLit name
964 ; gensym_app <- repGensym lit_str
965 ; repBindQ var_ty elt_ty
966 gensym_app (MkC (Lam id body')) }
968 -- Just like wrapGenSym, but don't actually do the gensym
969 -- Instead use the existing name:
970 -- let x = "x" in ...
971 -- Only used for [Decl], and for the class ops in class
972 -- and instance decls
973 wrapNongenSyms :: [GenSymBind] -> Core a -> DsM (Core a)
974 wrapNongenSyms binds (MkC body)
975 = do { binds' <- mapM do_one binds ;
976 return (MkC (mkLets binds' body)) }
979 = do { MkC lit_str <- occNameLit name
980 ; MkC var <- rep2 mkNameName [lit_str]
981 ; return (NonRec id var) }
983 occNameLit :: Name -> DsM (Core String)
984 occNameLit n = coreStringLit (occNameString (nameOccName n))
987 -- %*********************************************************************
991 -- %*********************************************************************
993 -----------------------------------------------------------------------------
994 -- PHANTOM TYPES for consistency. In order to make sure we do this correct
995 -- we invent a new datatype which uses phantom types.
997 newtype Core a = MkC CoreExpr
1000 rep2 :: Name -> [ CoreExpr ] -> DsM (Core a)
1001 rep2 n xs = do { id <- dsLookupGlobalId n
1002 ; return (MkC (foldl App (Var id) xs)) }
1004 -- Then we make "repConstructors" which use the phantom types for each of the
1005 -- smart constructors of the Meta.Meta datatypes.
1008 -- %*********************************************************************
1010 -- The 'smart constructors'
1012 -- %*********************************************************************
1014 --------------- Patterns -----------------
1015 repPlit :: Core TH.Lit -> DsM (Core TH.PatQ)
1016 repPlit (MkC l) = rep2 litPName [l]
1018 repPvar :: Core TH.Name -> DsM (Core TH.PatQ)
1019 repPvar (MkC s) = rep2 varPName [s]
1021 repPtup :: Core [TH.PatQ] -> DsM (Core TH.PatQ)
1022 repPtup (MkC ps) = rep2 tupPName [ps]
1024 repPcon :: Core TH.Name -> Core [TH.PatQ] -> DsM (Core TH.PatQ)
1025 repPcon (MkC s) (MkC ps) = rep2 conPName [s, ps]
1027 repPrec :: Core TH.Name -> Core [(TH.Name,TH.PatQ)] -> DsM (Core TH.PatQ)
1028 repPrec (MkC c) (MkC rps) = rep2 recPName [c,rps]
1030 repPinfix :: Core TH.PatQ -> Core TH.Name -> Core TH.PatQ -> DsM (Core TH.PatQ)
1031 repPinfix (MkC p1) (MkC n) (MkC p2) = rep2 infixPName [p1, n, p2]
1033 repPtilde :: Core TH.PatQ -> DsM (Core TH.PatQ)
1034 repPtilde (MkC p) = rep2 tildePName [p]
1036 repPaspat :: Core TH.Name -> Core TH.PatQ -> DsM (Core TH.PatQ)
1037 repPaspat (MkC s) (MkC p) = rep2 asPName [s, p]
1039 repPwild :: DsM (Core TH.PatQ)
1040 repPwild = rep2 wildPName []
1042 repPlist :: Core [TH.PatQ] -> DsM (Core TH.PatQ)
1043 repPlist (MkC ps) = rep2 listPName [ps]
1045 --------------- Expressions -----------------
1046 repVarOrCon :: Name -> Core TH.Name -> DsM (Core TH.ExpQ)
1047 repVarOrCon vc str | isDataOcc (nameOccName vc) = repCon str
1048 | otherwise = repVar str
1050 repVar :: Core TH.Name -> DsM (Core TH.ExpQ)
1051 repVar (MkC s) = rep2 varEName [s]
1053 repCon :: Core TH.Name -> DsM (Core TH.ExpQ)
1054 repCon (MkC s) = rep2 conEName [s]
1056 repLit :: Core TH.Lit -> DsM (Core TH.ExpQ)
1057 repLit (MkC c) = rep2 litEName [c]
1059 repApp :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1060 repApp (MkC x) (MkC y) = rep2 appEName [x,y]
1062 repLam :: Core [TH.PatQ] -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1063 repLam (MkC ps) (MkC e) = rep2 lamEName [ps, e]
1065 repTup :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)
1066 repTup (MkC es) = rep2 tupEName [es]
1068 repCond :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1069 repCond (MkC x) (MkC y) (MkC z) = rep2 condEName [x,y,z]
1071 repLetE :: Core [TH.DecQ] -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1072 repLetE (MkC ds) (MkC e) = rep2 letEName [ds, e]
1074 repCaseE :: Core TH.ExpQ -> Core [TH.MatchQ] -> DsM( Core TH.ExpQ)
1075 repCaseE (MkC e) (MkC ms) = rep2 caseEName [e, ms]
1077 repDoE :: Core [TH.StmtQ] -> DsM (Core TH.ExpQ)
1078 repDoE (MkC ss) = rep2 doEName [ss]
1080 repComp :: Core [TH.StmtQ] -> DsM (Core TH.ExpQ)
1081 repComp (MkC ss) = rep2 compEName [ss]
1083 repListExp :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)
1084 repListExp (MkC es) = rep2 listEName [es]
1086 repSigExp :: Core TH.ExpQ -> Core TH.TypeQ -> DsM (Core TH.ExpQ)
1087 repSigExp (MkC e) (MkC t) = rep2 sigEName [e,t]
1089 repRecCon :: Core TH.Name -> Core [TH.Q TH.FieldExp]-> DsM (Core TH.ExpQ)
1090 repRecCon (MkC c) (MkC fs) = rep2 recConEName [c,fs]
1092 repRecUpd :: Core TH.ExpQ -> Core [TH.Q TH.FieldExp] -> DsM (Core TH.ExpQ)
1093 repRecUpd (MkC e) (MkC fs) = rep2 recUpdEName [e,fs]
1095 repFieldExp :: Core TH.Name -> Core TH.ExpQ -> DsM (Core (TH.Q TH.FieldExp))
1096 repFieldExp (MkC n) (MkC x) = rep2 fieldExpName [n,x]
1098 repInfixApp :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1099 repInfixApp (MkC x) (MkC y) (MkC z) = rep2 infixAppName [x,y,z]
1101 repSectionL :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1102 repSectionL (MkC x) (MkC y) = rep2 sectionLName [x,y]
1104 repSectionR :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1105 repSectionR (MkC x) (MkC y) = rep2 sectionRName [x,y]
1107 ------------ Right hand sides (guarded expressions) ----
1108 repGuarded :: Core [TH.Q (TH.Guard, TH.Exp)] -> DsM (Core TH.BodyQ)
1109 repGuarded (MkC pairs) = rep2 guardedBName [pairs]
1111 repNormal :: Core TH.ExpQ -> DsM (Core TH.BodyQ)
1112 repNormal (MkC e) = rep2 normalBName [e]
1114 ------------ Guards ----
1115 repLNormalGE :: LHsExpr Name -> LHsExpr Name -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1116 repLNormalGE g e = do g' <- repLE g
1120 repNormalGE :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1121 repNormalGE (MkC g) (MkC e) = rep2 normalGEName [g, e]
1123 repPatGE :: Core [TH.StmtQ] -> Core TH.ExpQ -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1124 repPatGE (MkC ss) (MkC e) = rep2 patGEName [ss, e]
1126 ------------- Stmts -------------------
1127 repBindSt :: Core TH.PatQ -> Core TH.ExpQ -> DsM (Core TH.StmtQ)
1128 repBindSt (MkC p) (MkC e) = rep2 bindSName [p,e]
1130 repLetSt :: Core [TH.DecQ] -> DsM (Core TH.StmtQ)
1131 repLetSt (MkC ds) = rep2 letSName [ds]
1133 repNoBindSt :: Core TH.ExpQ -> DsM (Core TH.StmtQ)
1134 repNoBindSt (MkC e) = rep2 noBindSName [e]
1136 -------------- Range (Arithmetic sequences) -----------
1137 repFrom :: Core TH.ExpQ -> DsM (Core TH.ExpQ)
1138 repFrom (MkC x) = rep2 fromEName [x]
1140 repFromThen :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1141 repFromThen (MkC x) (MkC y) = rep2 fromThenEName [x,y]
1143 repFromTo :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1144 repFromTo (MkC x) (MkC y) = rep2 fromToEName [x,y]
1146 repFromThenTo :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1147 repFromThenTo (MkC x) (MkC y) (MkC z) = rep2 fromThenToEName [x,y,z]
1149 ------------ Match and Clause Tuples -----------
1150 repMatch :: Core TH.PatQ -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.MatchQ)
1151 repMatch (MkC p) (MkC bod) (MkC ds) = rep2 matchName [p, bod, ds]
1153 repClause :: Core [TH.PatQ] -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.ClauseQ)
1154 repClause (MkC ps) (MkC bod) (MkC ds) = rep2 clauseName [ps, bod, ds]
1156 -------------- Dec -----------------------------
1157 repVal :: Core TH.PatQ -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1158 repVal (MkC p) (MkC b) (MkC ds) = rep2 valDName [p, b, ds]
1160 repFun :: Core TH.Name -> Core [TH.ClauseQ] -> DsM (Core TH.DecQ)
1161 repFun (MkC nm) (MkC b) = rep2 funDName [nm, b]
1163 repData :: Core TH.CxtQ -> Core TH.Name -> Core [TH.Name] -> Core [TH.ConQ] -> Core [TH.Name] -> DsM (Core TH.DecQ)
1164 repData (MkC cxt) (MkC nm) (MkC tvs) (MkC cons) (MkC derivs)
1165 = rep2 dataDName [cxt, nm, tvs, cons, derivs]
1167 repNewtype :: Core TH.CxtQ -> Core TH.Name -> Core [TH.Name] -> Core TH.ConQ -> Core [TH.Name] -> DsM (Core TH.DecQ)
1168 repNewtype (MkC cxt) (MkC nm) (MkC tvs) (MkC con) (MkC derivs)
1169 = rep2 newtypeDName [cxt, nm, tvs, con, derivs]
1171 repTySyn :: Core TH.Name -> Core [TH.Name] -> Core TH.TypeQ -> DsM (Core TH.DecQ)
1172 repTySyn (MkC nm) (MkC tvs) (MkC rhs) = rep2 tySynDName [nm, tvs, rhs]
1174 repInst :: Core TH.CxtQ -> Core TH.TypeQ -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1175 repInst (MkC cxt) (MkC ty) (MkC ds) = rep2 instanceDName [cxt, ty, ds]
1177 repClass :: Core TH.CxtQ -> Core TH.Name -> Core [TH.Name] -> Core [TH.FunDep] -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1178 repClass (MkC cxt) (MkC cls) (MkC tvs) (MkC fds) (MkC ds) = rep2 classDName [cxt, cls, tvs, fds, ds]
1180 repFunDep :: Core [TH.Name] -> Core [TH.Name] -> DsM (Core TH.FunDep)
1181 repFunDep (MkC xs) (MkC ys) = rep2 funDepName [xs, ys]
1183 repProto :: Core TH.Name -> Core TH.TypeQ -> DsM (Core TH.DecQ)
1184 repProto (MkC s) (MkC ty) = rep2 sigDName [s, ty]
1186 repCtxt :: Core [TH.TypeQ] -> DsM (Core TH.CxtQ)
1187 repCtxt (MkC tys) = rep2 cxtName [tys]
1189 repConstr :: Core TH.Name -> HsConDeclDetails Name
1190 -> DsM (Core TH.ConQ)
1191 repConstr con (PrefixCon ps)
1192 = do arg_tys <- mapM repBangTy ps
1193 arg_tys1 <- coreList strictTypeQTyConName arg_tys
1194 rep2 normalCName [unC con, unC arg_tys1]
1195 repConstr con (RecCon ips)
1196 = do arg_vs <- mapM lookupLOcc (map cd_fld_name ips)
1197 arg_tys <- mapM repBangTy (map cd_fld_type ips)
1198 arg_vtys <- zipWithM (\x y -> rep2 varStrictTypeName [unC x, unC y])
1200 arg_vtys' <- coreList varStrictTypeQTyConName arg_vtys
1201 rep2 recCName [unC con, unC arg_vtys']
1202 repConstr con (InfixCon st1 st2)
1203 = do arg1 <- repBangTy st1
1204 arg2 <- repBangTy st2
1205 rep2 infixCName [unC arg1, unC con, unC arg2]
1207 ------------ Types -------------------
1209 repTForall :: Core [TH.Name] -> Core TH.CxtQ -> Core TH.TypeQ -> DsM (Core TH.TypeQ)
1210 repTForall (MkC tvars) (MkC ctxt) (MkC ty)
1211 = rep2 forallTName [tvars, ctxt, ty]
1213 repTvar :: Core TH.Name -> DsM (Core TH.TypeQ)
1214 repTvar (MkC s) = rep2 varTName [s]
1216 repTapp :: Core TH.TypeQ -> Core TH.TypeQ -> DsM (Core TH.TypeQ)
1217 repTapp (MkC t1) (MkC t2) = rep2 appTName [t1,t2]
1219 repTapps :: Core TH.TypeQ -> [Core TH.TypeQ] -> DsM (Core TH.TypeQ)
1220 repTapps f [] = return f
1221 repTapps f (t:ts) = do { f1 <- repTapp f t; repTapps f1 ts }
1223 --------- Type constructors --------------
1225 repNamedTyCon :: Core TH.Name -> DsM (Core TH.TypeQ)
1226 repNamedTyCon (MkC s) = rep2 conTName [s]
1228 repTupleTyCon :: Int -> DsM (Core TH.TypeQ)
1229 -- Note: not Core Int; it's easier to be direct here
1230 repTupleTyCon i = rep2 tupleTName [mkIntExpr (fromIntegral i)]
1232 repArrowTyCon :: DsM (Core TH.TypeQ)
1233 repArrowTyCon = rep2 arrowTName []
1235 repListTyCon :: DsM (Core TH.TypeQ)
1236 repListTyCon = rep2 listTName []
1239 ----------------------------------------------------------
1242 repLiteral :: HsLit -> DsM (Core TH.Lit)
1244 = do lit' <- case lit of
1245 HsIntPrim i -> mk_integer i
1246 HsInt i -> mk_integer i
1247 HsFloatPrim r -> mk_rational r
1248 HsDoublePrim r -> mk_rational r
1250 lit_expr <- dsLit lit'
1252 Just lit_name -> rep2 lit_name [lit_expr]
1253 Nothing -> notHandled "Exotic literal" (ppr lit)
1255 mb_lit_name = case lit of
1256 HsInteger _ _ -> Just integerLName
1257 HsInt _ -> Just integerLName
1258 HsIntPrim _ -> Just intPrimLName
1259 HsFloatPrim _ -> Just floatPrimLName
1260 HsDoublePrim _ -> Just doublePrimLName
1261 HsChar _ -> Just charLName
1262 HsString _ -> Just stringLName
1263 HsRat _ _ -> Just rationalLName
1266 mk_integer i = do integer_ty <- lookupType integerTyConName
1267 return $ HsInteger i integer_ty
1268 mk_rational r = do rat_ty <- lookupType rationalTyConName
1269 return $ HsRat r rat_ty
1270 mk_string s = do string_ty <- lookupType stringTyConName
1273 repOverloadedLiteral :: HsOverLit Name -> DsM (Core TH.Lit)
1274 repOverloadedLiteral (HsIntegral i _) = do { lit <- mk_integer i; repLiteral lit }
1275 repOverloadedLiteral (HsFractional f _) = do { lit <- mk_rational f; repLiteral lit }
1276 repOverloadedLiteral (HsIsString s _) = do { lit <- mk_string s; repLiteral lit }
1277 -- The type Rational will be in the environment, becuase
1278 -- the smart constructor 'TH.Syntax.rationalL' uses it in its type,
1279 -- and rationalL is sucked in when any TH stuff is used
1281 --------------- Miscellaneous -------------------
1283 repGensym :: Core String -> DsM (Core (TH.Q TH.Name))
1284 repGensym (MkC lit_str) = rep2 newNameName [lit_str]
1286 repBindQ :: Type -> Type -- a and b
1287 -> Core (TH.Q a) -> Core (a -> TH.Q b) -> DsM (Core (TH.Q b))
1288 repBindQ ty_a ty_b (MkC x) (MkC y)
1289 = rep2 bindQName [Type ty_a, Type ty_b, x, y]
1291 repSequenceQ :: Type -> Core [TH.Q a] -> DsM (Core (TH.Q [a]))
1292 repSequenceQ ty_a (MkC list)
1293 = rep2 sequenceQName [Type ty_a, list]
1295 ------------ Lists and Tuples -------------------
1296 -- turn a list of patterns into a single pattern matching a list
1298 coreList :: Name -- Of the TyCon of the element type
1299 -> [Core a] -> DsM (Core [a])
1301 = do { elt_ty <- lookupType tc_name; return (coreList' elt_ty es) }
1303 coreList' :: Type -- The element type
1304 -> [Core a] -> Core [a]
1305 coreList' elt_ty es = MkC (mkListExpr elt_ty (map unC es ))
1307 nonEmptyCoreList :: [Core a] -> Core [a]
1308 -- The list must be non-empty so we can get the element type
1309 -- Otherwise use coreList
1310 nonEmptyCoreList [] = panic "coreList: empty argument"
1311 nonEmptyCoreList xs@(MkC x:_) = MkC (mkListExpr (exprType x) (map unC xs))
1313 corePair :: (Core a, Core b) -> Core (a,b)
1314 corePair (MkC x, MkC y) = MkC (mkCoreTup [x,y])
1316 coreStringLit :: String -> DsM (Core String)
1317 coreStringLit s = do { z <- mkStringExpr s; return(MkC z) }
1319 coreIntLit :: Int -> DsM (Core Int)
1320 coreIntLit i = return (MkC (mkIntExpr (fromIntegral i)))
1322 coreVar :: Id -> Core TH.Name -- The Id has type Name
1323 coreVar id = MkC (Var id)
1325 ----------------- Failure -----------------------
1326 notHandled :: String -> SDoc -> DsM a
1327 notHandled what doc = failWithDs msg
1329 msg = hang (text what <+> ptext SLIT("not (yet) handled by Template Haskell"))
1333 -- %************************************************************************
1335 -- The known-key names for Template Haskell
1337 -- %************************************************************************
1339 -- To add a name, do three things
1341 -- 1) Allocate a key
1343 -- 3) Add the name to knownKeyNames
1345 templateHaskellNames :: [Name]
1346 -- The names that are implicitly mentioned by ``bracket''
1347 -- Should stay in sync with the import list of DsMeta
1349 templateHaskellNames = [
1350 returnQName, bindQName, sequenceQName, newNameName, liftName,
1351 mkNameName, mkNameG_vName, mkNameG_dName, mkNameG_tcName, mkNameLName,
1354 charLName, stringLName, integerLName, intPrimLName,
1355 floatPrimLName, doublePrimLName, rationalLName,
1357 litPName, varPName, tupPName, conPName, tildePName, infixPName,
1358 asPName, wildPName, recPName, listPName, sigPName,
1366 varEName, conEName, litEName, appEName, infixEName,
1367 infixAppName, sectionLName, sectionRName, lamEName, tupEName,
1368 condEName, letEName, caseEName, doEName, compEName,
1369 fromEName, fromThenEName, fromToEName, fromThenToEName,
1370 listEName, sigEName, recConEName, recUpdEName,
1374 guardedBName, normalBName,
1376 normalGEName, patGEName,
1378 bindSName, letSName, noBindSName, parSName,
1380 funDName, valDName, dataDName, newtypeDName, tySynDName,
1381 classDName, instanceDName, sigDName, forImpDName,
1385 isStrictName, notStrictName,
1387 normalCName, recCName, infixCName, forallCName,
1393 forallTName, varTName, conTName, appTName,
1394 tupleTName, arrowTName, listTName,
1396 cCallName, stdCallName,
1405 qTyConName, nameTyConName, patTyConName, fieldPatTyConName, matchQTyConName,
1406 clauseQTyConName, expQTyConName, fieldExpTyConName, stmtQTyConName,
1407 decQTyConName, conQTyConName, strictTypeQTyConName,
1408 varStrictTypeQTyConName, typeQTyConName, expTyConName, decTyConName,
1409 typeTyConName, matchTyConName, clauseTyConName, patQTyConName,
1410 fieldPatQTyConName, fieldExpQTyConName, funDepTyConName]
1413 thSyn = mkTHModule FSLIT("Language.Haskell.TH.Syntax")
1414 thLib = mkTHModule FSLIT("Language.Haskell.TH.Lib")
1416 mkTHModule m = mkModule thPackageId (mkModuleNameFS m)
1418 libFun = mk_known_key_name OccName.varName thLib
1419 libTc = mk_known_key_name OccName.tcName thLib
1420 thFun = mk_known_key_name OccName.varName thSyn
1421 thTc = mk_known_key_name OccName.tcName thSyn
1423 -------------------- TH.Syntax -----------------------
1424 qTyConName = thTc FSLIT("Q") qTyConKey
1425 nameTyConName = thTc FSLIT("Name") nameTyConKey
1426 fieldExpTyConName = thTc FSLIT("FieldExp") fieldExpTyConKey
1427 patTyConName = thTc FSLIT("Pat") patTyConKey
1428 fieldPatTyConName = thTc FSLIT("FieldPat") fieldPatTyConKey
1429 expTyConName = thTc FSLIT("Exp") expTyConKey
1430 decTyConName = thTc FSLIT("Dec") decTyConKey
1431 typeTyConName = thTc FSLIT("Type") typeTyConKey
1432 matchTyConName = thTc FSLIT("Match") matchTyConKey
1433 clauseTyConName = thTc FSLIT("Clause") clauseTyConKey
1434 funDepTyConName = thTc FSLIT("FunDep") funDepTyConKey
1436 returnQName = thFun FSLIT("returnQ") returnQIdKey
1437 bindQName = thFun FSLIT("bindQ") bindQIdKey
1438 sequenceQName = thFun FSLIT("sequenceQ") sequenceQIdKey
1439 newNameName = thFun FSLIT("newName") newNameIdKey
1440 liftName = thFun FSLIT("lift") liftIdKey
1441 mkNameName = thFun FSLIT("mkName") mkNameIdKey
1442 mkNameG_vName = thFun FSLIT("mkNameG_v") mkNameG_vIdKey
1443 mkNameG_dName = thFun FSLIT("mkNameG_d") mkNameG_dIdKey
1444 mkNameG_tcName = thFun FSLIT("mkNameG_tc") mkNameG_tcIdKey
1445 mkNameLName = thFun FSLIT("mkNameL") mkNameLIdKey
1448 -------------------- TH.Lib -----------------------
1450 charLName = libFun FSLIT("charL") charLIdKey
1451 stringLName = libFun FSLIT("stringL") stringLIdKey
1452 integerLName = libFun FSLIT("integerL") integerLIdKey
1453 intPrimLName = libFun FSLIT("intPrimL") intPrimLIdKey
1454 floatPrimLName = libFun FSLIT("floatPrimL") floatPrimLIdKey
1455 doublePrimLName = libFun FSLIT("doublePrimL") doublePrimLIdKey
1456 rationalLName = libFun FSLIT("rationalL") rationalLIdKey
1459 litPName = libFun FSLIT("litP") litPIdKey
1460 varPName = libFun FSLIT("varP") varPIdKey
1461 tupPName = libFun FSLIT("tupP") tupPIdKey
1462 conPName = libFun FSLIT("conP") conPIdKey
1463 infixPName = libFun FSLIT("infixP") infixPIdKey
1464 tildePName = libFun FSLIT("tildeP") tildePIdKey
1465 asPName = libFun FSLIT("asP") asPIdKey
1466 wildPName = libFun FSLIT("wildP") wildPIdKey
1467 recPName = libFun FSLIT("recP") recPIdKey
1468 listPName = libFun FSLIT("listP") listPIdKey
1469 sigPName = libFun FSLIT("sigP") sigPIdKey
1471 -- type FieldPat = ...
1472 fieldPatName = libFun FSLIT("fieldPat") fieldPatIdKey
1475 matchName = libFun FSLIT("match") matchIdKey
1477 -- data Clause = ...
1478 clauseName = libFun FSLIT("clause") clauseIdKey
1481 varEName = libFun FSLIT("varE") varEIdKey
1482 conEName = libFun FSLIT("conE") conEIdKey
1483 litEName = libFun FSLIT("litE") litEIdKey
1484 appEName = libFun FSLIT("appE") appEIdKey
1485 infixEName = libFun FSLIT("infixE") infixEIdKey
1486 infixAppName = libFun FSLIT("infixApp") infixAppIdKey
1487 sectionLName = libFun FSLIT("sectionL") sectionLIdKey
1488 sectionRName = libFun FSLIT("sectionR") sectionRIdKey
1489 lamEName = libFun FSLIT("lamE") lamEIdKey
1490 tupEName = libFun FSLIT("tupE") tupEIdKey
1491 condEName = libFun FSLIT("condE") condEIdKey
1492 letEName = libFun FSLIT("letE") letEIdKey
1493 caseEName = libFun FSLIT("caseE") caseEIdKey
1494 doEName = libFun FSLIT("doE") doEIdKey
1495 compEName = libFun FSLIT("compE") compEIdKey
1496 -- ArithSeq skips a level
1497 fromEName = libFun FSLIT("fromE") fromEIdKey
1498 fromThenEName = libFun FSLIT("fromThenE") fromThenEIdKey
1499 fromToEName = libFun FSLIT("fromToE") fromToEIdKey
1500 fromThenToEName = libFun FSLIT("fromThenToE") fromThenToEIdKey
1502 listEName = libFun FSLIT("listE") listEIdKey
1503 sigEName = libFun FSLIT("sigE") sigEIdKey
1504 recConEName = libFun FSLIT("recConE") recConEIdKey
1505 recUpdEName = libFun FSLIT("recUpdE") recUpdEIdKey
1507 -- type FieldExp = ...
1508 fieldExpName = libFun FSLIT("fieldExp") fieldExpIdKey
1511 guardedBName = libFun FSLIT("guardedB") guardedBIdKey
1512 normalBName = libFun FSLIT("normalB") normalBIdKey
1515 normalGEName = libFun FSLIT("normalGE") normalGEIdKey
1516 patGEName = libFun FSLIT("patGE") patGEIdKey
1519 bindSName = libFun FSLIT("bindS") bindSIdKey
1520 letSName = libFun FSLIT("letS") letSIdKey
1521 noBindSName = libFun FSLIT("noBindS") noBindSIdKey
1522 parSName = libFun FSLIT("parS") parSIdKey
1525 funDName = libFun FSLIT("funD") funDIdKey
1526 valDName = libFun FSLIT("valD") valDIdKey
1527 dataDName = libFun FSLIT("dataD") dataDIdKey
1528 newtypeDName = libFun FSLIT("newtypeD") newtypeDIdKey
1529 tySynDName = libFun FSLIT("tySynD") tySynDIdKey
1530 classDName = libFun FSLIT("classD") classDIdKey
1531 instanceDName = libFun FSLIT("instanceD") instanceDIdKey
1532 sigDName = libFun FSLIT("sigD") sigDIdKey
1533 forImpDName = libFun FSLIT("forImpD") forImpDIdKey
1536 cxtName = libFun FSLIT("cxt") cxtIdKey
1538 -- data Strict = ...
1539 isStrictName = libFun FSLIT("isStrict") isStrictKey
1540 notStrictName = libFun FSLIT("notStrict") notStrictKey
1543 normalCName = libFun FSLIT("normalC") normalCIdKey
1544 recCName = libFun FSLIT("recC") recCIdKey
1545 infixCName = libFun FSLIT("infixC") infixCIdKey
1546 forallCName = libFun FSLIT("forallC") forallCIdKey
1548 -- type StrictType = ...
1549 strictTypeName = libFun FSLIT("strictType") strictTKey
1551 -- type VarStrictType = ...
1552 varStrictTypeName = libFun FSLIT("varStrictType") varStrictTKey
1555 forallTName = libFun FSLIT("forallT") forallTIdKey
1556 varTName = libFun FSLIT("varT") varTIdKey
1557 conTName = libFun FSLIT("conT") conTIdKey
1558 tupleTName = libFun FSLIT("tupleT") tupleTIdKey
1559 arrowTName = libFun FSLIT("arrowT") arrowTIdKey
1560 listTName = libFun FSLIT("listT") listTIdKey
1561 appTName = libFun FSLIT("appT") appTIdKey
1563 -- data Callconv = ...
1564 cCallName = libFun FSLIT("cCall") cCallIdKey
1565 stdCallName = libFun FSLIT("stdCall") stdCallIdKey
1567 -- data Safety = ...
1568 unsafeName = libFun FSLIT("unsafe") unsafeIdKey
1569 safeName = libFun FSLIT("safe") safeIdKey
1570 threadsafeName = libFun FSLIT("threadsafe") threadsafeIdKey
1572 -- data FunDep = ...
1573 funDepName = libFun FSLIT("funDep") funDepIdKey
1575 matchQTyConName = libTc FSLIT("MatchQ") matchQTyConKey
1576 clauseQTyConName = libTc FSLIT("ClauseQ") clauseQTyConKey
1577 expQTyConName = libTc FSLIT("ExpQ") expQTyConKey
1578 stmtQTyConName = libTc FSLIT("StmtQ") stmtQTyConKey
1579 decQTyConName = libTc FSLIT("DecQ") decQTyConKey
1580 conQTyConName = libTc FSLIT("ConQ") conQTyConKey
1581 strictTypeQTyConName = libTc FSLIT("StrictTypeQ") strictTypeQTyConKey
1582 varStrictTypeQTyConName = libTc FSLIT("VarStrictTypeQ") varStrictTypeQTyConKey
1583 typeQTyConName = libTc FSLIT("TypeQ") typeQTyConKey
1584 fieldExpQTyConName = libTc FSLIT("FieldExpQ") fieldExpQTyConKey
1585 patQTyConName = libTc FSLIT("PatQ") patQTyConKey
1586 fieldPatQTyConName = libTc FSLIT("FieldPatQ") fieldPatQTyConKey
1588 -- TyConUniques available: 100-129
1589 -- Check in PrelNames if you want to change this
1591 expTyConKey = mkPreludeTyConUnique 100
1592 matchTyConKey = mkPreludeTyConUnique 101
1593 clauseTyConKey = mkPreludeTyConUnique 102
1594 qTyConKey = mkPreludeTyConUnique 103
1595 expQTyConKey = mkPreludeTyConUnique 104
1596 decQTyConKey = mkPreludeTyConUnique 105
1597 patTyConKey = mkPreludeTyConUnique 106
1598 matchQTyConKey = mkPreludeTyConUnique 107
1599 clauseQTyConKey = mkPreludeTyConUnique 108
1600 stmtQTyConKey = mkPreludeTyConUnique 109
1601 conQTyConKey = mkPreludeTyConUnique 110
1602 typeQTyConKey = mkPreludeTyConUnique 111
1603 typeTyConKey = mkPreludeTyConUnique 112
1604 decTyConKey = mkPreludeTyConUnique 113
1605 varStrictTypeQTyConKey = mkPreludeTyConUnique 114
1606 strictTypeQTyConKey = mkPreludeTyConUnique 115
1607 fieldExpTyConKey = mkPreludeTyConUnique 116
1608 fieldPatTyConKey = mkPreludeTyConUnique 117
1609 nameTyConKey = mkPreludeTyConUnique 118
1610 patQTyConKey = mkPreludeTyConUnique 119
1611 fieldPatQTyConKey = mkPreludeTyConUnique 120
1612 fieldExpQTyConKey = mkPreludeTyConUnique 121
1613 funDepTyConKey = mkPreludeTyConUnique 122
1615 -- IdUniques available: 200-399
1616 -- If you want to change this, make sure you check in PrelNames
1618 returnQIdKey = mkPreludeMiscIdUnique 200
1619 bindQIdKey = mkPreludeMiscIdUnique 201
1620 sequenceQIdKey = mkPreludeMiscIdUnique 202
1621 liftIdKey = mkPreludeMiscIdUnique 203
1622 newNameIdKey = mkPreludeMiscIdUnique 204
1623 mkNameIdKey = mkPreludeMiscIdUnique 205
1624 mkNameG_vIdKey = mkPreludeMiscIdUnique 206
1625 mkNameG_dIdKey = mkPreludeMiscIdUnique 207
1626 mkNameG_tcIdKey = mkPreludeMiscIdUnique 208
1627 mkNameLIdKey = mkPreludeMiscIdUnique 209
1631 charLIdKey = mkPreludeMiscIdUnique 210
1632 stringLIdKey = mkPreludeMiscIdUnique 211
1633 integerLIdKey = mkPreludeMiscIdUnique 212
1634 intPrimLIdKey = mkPreludeMiscIdUnique 213
1635 floatPrimLIdKey = mkPreludeMiscIdUnique 214
1636 doublePrimLIdKey = mkPreludeMiscIdUnique 215
1637 rationalLIdKey = mkPreludeMiscIdUnique 216
1640 litPIdKey = mkPreludeMiscIdUnique 220
1641 varPIdKey = mkPreludeMiscIdUnique 221
1642 tupPIdKey = mkPreludeMiscIdUnique 222
1643 conPIdKey = mkPreludeMiscIdUnique 223
1644 infixPIdKey = mkPreludeMiscIdUnique 312
1645 tildePIdKey = mkPreludeMiscIdUnique 224
1646 asPIdKey = mkPreludeMiscIdUnique 225
1647 wildPIdKey = mkPreludeMiscIdUnique 226
1648 recPIdKey = mkPreludeMiscIdUnique 227
1649 listPIdKey = mkPreludeMiscIdUnique 228
1650 sigPIdKey = mkPreludeMiscIdUnique 229
1652 -- type FieldPat = ...
1653 fieldPatIdKey = mkPreludeMiscIdUnique 230
1656 matchIdKey = mkPreludeMiscIdUnique 231
1658 -- data Clause = ...
1659 clauseIdKey = mkPreludeMiscIdUnique 232
1662 varEIdKey = mkPreludeMiscIdUnique 240
1663 conEIdKey = mkPreludeMiscIdUnique 241
1664 litEIdKey = mkPreludeMiscIdUnique 242
1665 appEIdKey = mkPreludeMiscIdUnique 243
1666 infixEIdKey = mkPreludeMiscIdUnique 244
1667 infixAppIdKey = mkPreludeMiscIdUnique 245
1668 sectionLIdKey = mkPreludeMiscIdUnique 246
1669 sectionRIdKey = mkPreludeMiscIdUnique 247
1670 lamEIdKey = mkPreludeMiscIdUnique 248
1671 tupEIdKey = mkPreludeMiscIdUnique 249
1672 condEIdKey = mkPreludeMiscIdUnique 250
1673 letEIdKey = mkPreludeMiscIdUnique 251
1674 caseEIdKey = mkPreludeMiscIdUnique 252
1675 doEIdKey = mkPreludeMiscIdUnique 253
1676 compEIdKey = mkPreludeMiscIdUnique 254
1677 fromEIdKey = mkPreludeMiscIdUnique 255
1678 fromThenEIdKey = mkPreludeMiscIdUnique 256
1679 fromToEIdKey = mkPreludeMiscIdUnique 257
1680 fromThenToEIdKey = mkPreludeMiscIdUnique 258
1681 listEIdKey = mkPreludeMiscIdUnique 259
1682 sigEIdKey = mkPreludeMiscIdUnique 260
1683 recConEIdKey = mkPreludeMiscIdUnique 261
1684 recUpdEIdKey = mkPreludeMiscIdUnique 262
1686 -- type FieldExp = ...
1687 fieldExpIdKey = mkPreludeMiscIdUnique 265
1690 guardedBIdKey = mkPreludeMiscIdUnique 266
1691 normalBIdKey = mkPreludeMiscIdUnique 267
1694 normalGEIdKey = mkPreludeMiscIdUnique 310
1695 patGEIdKey = mkPreludeMiscIdUnique 311
1698 bindSIdKey = mkPreludeMiscIdUnique 268
1699 letSIdKey = mkPreludeMiscIdUnique 269
1700 noBindSIdKey = mkPreludeMiscIdUnique 270
1701 parSIdKey = mkPreludeMiscIdUnique 271
1704 funDIdKey = mkPreludeMiscIdUnique 272
1705 valDIdKey = mkPreludeMiscIdUnique 273
1706 dataDIdKey = mkPreludeMiscIdUnique 274
1707 newtypeDIdKey = mkPreludeMiscIdUnique 275
1708 tySynDIdKey = mkPreludeMiscIdUnique 276
1709 classDIdKey = mkPreludeMiscIdUnique 277
1710 instanceDIdKey = mkPreludeMiscIdUnique 278
1711 sigDIdKey = mkPreludeMiscIdUnique 279
1712 forImpDIdKey = mkPreludeMiscIdUnique 297
1715 cxtIdKey = mkPreludeMiscIdUnique 280
1717 -- data Strict = ...
1718 isStrictKey = mkPreludeMiscIdUnique 281
1719 notStrictKey = mkPreludeMiscIdUnique 282
1722 normalCIdKey = mkPreludeMiscIdUnique 283
1723 recCIdKey = mkPreludeMiscIdUnique 284
1724 infixCIdKey = mkPreludeMiscIdUnique 285
1725 forallCIdKey = mkPreludeMiscIdUnique 288
1727 -- type StrictType = ...
1728 strictTKey = mkPreludeMiscIdUnique 286
1730 -- type VarStrictType = ...
1731 varStrictTKey = mkPreludeMiscIdUnique 287
1734 forallTIdKey = mkPreludeMiscIdUnique 290
1735 varTIdKey = mkPreludeMiscIdUnique 291
1736 conTIdKey = mkPreludeMiscIdUnique 292
1737 tupleTIdKey = mkPreludeMiscIdUnique 294
1738 arrowTIdKey = mkPreludeMiscIdUnique 295
1739 listTIdKey = mkPreludeMiscIdUnique 296
1740 appTIdKey = mkPreludeMiscIdUnique 293
1742 -- data Callconv = ...
1743 cCallIdKey = mkPreludeMiscIdUnique 300
1744 stdCallIdKey = mkPreludeMiscIdUnique 301
1746 -- data Safety = ...
1747 unsafeIdKey = mkPreludeMiscIdUnique 305
1748 safeIdKey = mkPreludeMiscIdUnique 306
1749 threadsafeIdKey = mkPreludeMiscIdUnique 307
1751 -- data FunDep = ...
1752 funDepIdKey = mkPreludeMiscIdUnique 320