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
37 -- To avoid clashes with DsMeta.varName we must make a local alias for
38 -- OccName.varName we do this by removing varName from the import of
39 -- OccName above, making a qualified instance of OccName and using
40 -- OccNameAlias.varName where varName ws previously used in this file.
41 import qualified OccName
67 -----------------------------------------------------------------------------
68 dsBracket :: HsBracket Name -> [PendingSplice] -> DsM CoreExpr
69 -- Returns a CoreExpr of type TH.ExpQ
70 -- The quoted thing is parameterised over Name, even though it has
71 -- been type checked. We don't want all those type decorations!
73 dsBracket brack splices
74 = dsExtendMetaEnv new_bit (do_brack brack)
76 new_bit = mkNameEnv [(n, Splice (unLoc e)) | (n,e) <- splices]
78 do_brack (VarBr n) = do { MkC e1 <- lookupOcc n ; return e1 }
79 do_brack (ExpBr e) = do { MkC e1 <- repLE e ; return e1 }
80 do_brack (PatBr p) = do { MkC p1 <- repLP p ; return p1 }
81 do_brack (TypBr t) = do { MkC t1 <- repLTy t ; return t1 }
82 do_brack (DecBr ds) = do { MkC ds1 <- repTopDs ds ; return ds1 }
84 {- -------------- Examples --------------------
88 gensym (unpackString "x"#) `bindQ` \ x1::String ->
89 lam (pvar x1) (var x1)
92 [| \x -> $(f [| x |]) |]
94 gensym (unpackString "x"#) `bindQ` \ x1::String ->
95 lam (pvar x1) (f (var x1))
99 -------------------------------------------------------
101 -------------------------------------------------------
103 repTopDs :: HsGroup Name -> DsM (Core (TH.Q [TH.Dec]))
105 = do { let { bndrs = map unLoc (groupBinders group) } ;
106 ss <- mkGenSyms bndrs ;
108 -- Bind all the names mainly to avoid repeated use of explicit strings.
110 -- do { t :: String <- genSym "T" ;
111 -- return (Data t [] ...more t's... }
112 -- The other important reason is that the output must mention
113 -- only "T", not "Foo:T" where Foo is the current module
116 decls <- addBinds ss (do {
117 val_ds <- rep_val_binds (hs_valds group) ;
118 tycl_ds <- mapM repTyClD (hs_tyclds group) ;
119 inst_ds <- mapM repInstD' (hs_instds group) ;
120 for_ds <- mapM repForD (hs_fords group) ;
122 return (de_loc $ sort_by_loc $ val_ds ++ catMaybes tycl_ds ++ inst_ds ++ for_ds) }) ;
124 decl_ty <- lookupType decQTyConName ;
125 let { core_list = coreList' decl_ty decls } ;
127 dec_ty <- lookupType decTyConName ;
128 q_decs <- repSequenceQ dec_ty core_list ;
130 wrapNongenSyms ss q_decs
131 -- Do *not* gensym top-level binders
134 groupBinders (HsGroup { hs_valds = val_decls, hs_tyclds = tycl_decls,
135 hs_fords = foreign_decls })
136 -- Collect the binders of a Group
137 = collectHsValBinders val_decls ++
138 [n | d <- tycl_decls, n <- tyClDeclNames (unLoc d)] ++
139 [n | L _ (ForeignImport n _ _) <- foreign_decls]
142 {- Note [Binders and occurrences]
143 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
144 When we desugar [d| data T = MkT |]
146 Data "T" [] [Con "MkT" []] []
148 Data "Foo:T" [] [Con "Foo:MkT" []] []
149 That is, the new data decl should fit into whatever new module it is
150 asked to fit in. We do *not* clone, though; no need for this:
157 then we must desugar to
158 foo = Data "Foo:T" [] [Con "Foo:MkT" []] []
160 So in repTopDs we bring the binders into scope with mkGenSyms and addBinds.
161 And we use lookupOcc, rather than lookupBinder
162 in repTyClD and repC.
166 repTyClD :: LTyClDecl Name -> DsM (Maybe (SrcSpan, Core TH.DecQ))
168 repTyClD (L loc (TyData { tcdND = DataType, tcdCtxt = cxt,
169 tcdLName = tc, tcdTyVars = tvs,
170 tcdCons = cons, tcdDerivs = mb_derivs }))
171 = do { tc1 <- lookupLOcc tc ; -- See note [Binders and occurrences]
172 dec <- addTyVarBinds tvs $ \bndrs -> do {
173 cxt1 <- repLContext cxt ;
174 cons1 <- mapM repC cons ;
175 cons2 <- coreList conQTyConName cons1 ;
176 derivs1 <- repDerivs mb_derivs ;
177 bndrs1 <- coreList nameTyConName bndrs ;
178 repData cxt1 tc1 bndrs1 cons2 derivs1 } ;
179 return $ Just (loc, dec) }
181 repTyClD (L loc (TyData { tcdND = NewType, tcdCtxt = cxt,
182 tcdLName = tc, tcdTyVars = tvs,
183 tcdCons = [con], tcdDerivs = mb_derivs }))
184 = do { tc1 <- lookupLOcc tc ; -- See note [Binders and occurrences]
185 dec <- addTyVarBinds tvs $ \bndrs -> do {
186 cxt1 <- repLContext cxt ;
188 derivs1 <- repDerivs mb_derivs ;
189 bndrs1 <- coreList nameTyConName bndrs ;
190 repNewtype cxt1 tc1 bndrs1 con1 derivs1 } ;
191 return $ Just (loc, dec) }
193 repTyClD (L loc (TySynonym { tcdLName = tc, tcdTyVars = tvs, tcdSynRhs = ty }))
194 = do { tc1 <- lookupLOcc tc ; -- See note [Binders and occurrences]
195 dec <- addTyVarBinds tvs $ \bndrs -> do {
197 bndrs1 <- coreList nameTyConName bndrs ;
198 repTySyn tc1 bndrs1 ty1 } ;
199 return (Just (loc, dec)) }
201 repTyClD (L loc (ClassDecl { tcdCtxt = cxt, tcdLName = cls,
204 tcdSigs = sigs, tcdMeths = meth_binds }))
205 = do { cls1 <- lookupLOcc cls ; -- See note [Binders and occurrences]
206 dec <- addTyVarBinds tvs $ \bndrs -> do {
207 cxt1 <- repLContext cxt ;
208 sigs1 <- rep_sigs sigs ;
209 binds1 <- rep_binds meth_binds ;
210 fds1 <- repLFunDeps fds;
211 decls1 <- coreList decQTyConName (sigs1 ++ binds1) ;
212 bndrs1 <- coreList nameTyConName bndrs ;
213 repClass cxt1 cls1 bndrs1 fds1 decls1 } ;
214 return $ Just (loc, dec) }
217 repTyClD (L loc d) = putSrcSpanDs loc $
218 do { warnDs (hang ds_msg 4 (ppr d))
223 repLFunDeps :: [Located (FunDep Name)] -> DsM (Core [TH.FunDep])
224 repLFunDeps fds = do fds' <- mapM repLFunDep fds
225 fdList <- coreList funDepTyConName fds'
228 repLFunDep :: Located (FunDep Name) -> DsM (Core TH.FunDep)
229 repLFunDep (L _ (xs, ys)) = do xs' <- mapM lookupBinder xs
230 ys' <- mapM lookupBinder ys
231 xs_list <- coreList nameTyConName xs'
232 ys_list <- coreList nameTyConName ys'
233 repFunDep xs_list ys_list
235 repInstD' (L loc (InstDecl ty binds _ _)) -- Ignore user pragmas for now
236 = do { i <- addTyVarBinds tvs $ \tv_bndrs ->
237 -- We must bring the type variables into scope, so their occurrences
238 -- don't fail, even though the binders don't appear in the resulting
240 do { cxt1 <- repContext cxt
241 ; inst_ty1 <- repPred (HsClassP cls tys)
242 ; ss <- mkGenSyms (collectHsBindBinders binds)
243 ; binds1 <- addBinds ss (rep_binds binds)
244 ; decls1 <- coreList decQTyConName binds1
245 ; decls2 <- wrapNongenSyms ss decls1
246 -- wrapNonGenSyms: do not clone the class op names!
247 -- They must be called 'op' etc, not 'op34'
248 ; repInst cxt1 inst_ty1 decls2 }
252 (tvs, cxt, cls, tys) = splitHsInstDeclTy (unLoc ty)
254 repForD :: Located (ForeignDecl Name) -> DsM (SrcSpan, Core TH.DecQ)
255 repForD (L loc (ForeignImport name typ (CImport cc s ch cn cis)))
256 = do MkC name' <- lookupLOcc name
257 MkC typ' <- repLTy typ
258 MkC cc' <- repCCallConv cc
259 MkC s' <- repSafety s
260 cis' <- conv_cimportspec cis
261 MkC str <- coreStringLit $ static
262 ++ unpackFS ch ++ " "
263 ++ unpackFS cn ++ " "
265 dec <- rep2 forImpDName [cc', s', str, name', typ']
268 conv_cimportspec (CLabel cls) = notHandled "Foreign label" (doubleQuotes (ppr cls))
269 conv_cimportspec (CFunction DynamicTarget) = return "dynamic"
270 conv_cimportspec (CFunction (StaticTarget fs)) = return (unpackFS fs)
271 conv_cimportspec CWrapper = return "wrapper"
273 CFunction (StaticTarget _) -> "static "
275 repForD decl = notHandled "Foreign declaration" (ppr decl)
277 repCCallConv :: CCallConv -> DsM (Core TH.Callconv)
278 repCCallConv CCallConv = rep2 cCallName []
279 repCCallConv StdCallConv = rep2 stdCallName []
281 repSafety :: Safety -> DsM (Core TH.Safety)
282 repSafety PlayRisky = rep2 unsafeName []
283 repSafety (PlaySafe False) = rep2 safeName []
284 repSafety (PlaySafe True) = rep2 threadsafeName []
286 ds_msg = ptext SLIT("Cannot desugar this Template Haskell declaration:")
288 -------------------------------------------------------
290 -------------------------------------------------------
292 repC :: LConDecl Name -> DsM (Core TH.ConQ)
293 repC (L loc (ConDecl con expl [] (L _ []) details ResTyH98 _))
294 = do { con1 <- lookupLOcc con ; -- See note [Binders and occurrences]
295 repConstr con1 details }
296 repC (L loc (ConDecl con expl tvs (L cloc ctxt) details ResTyH98 doc))
297 = do { addTyVarBinds tvs $ \bndrs -> do {
298 c' <- repC (L loc (ConDecl con expl [] (L cloc []) details ResTyH98 doc));
299 ctxt' <- repContext ctxt;
300 bndrs' <- coreList nameTyConName bndrs;
301 rep2 forallCName [unC bndrs', unC ctxt', unC c']
304 repC (L loc con_decl) -- GADTs
306 notHandled "GADT declaration" (ppr con_decl)
308 repBangTy :: LBangType Name -> DsM (Core (TH.StrictTypeQ))
312 rep2 strictTypeName [s, t]
314 (str, ty') = case ty of
315 L _ (HsBangTy _ ty) -> (isStrictName, ty)
316 other -> (notStrictName, ty)
318 -------------------------------------------------------
320 -------------------------------------------------------
322 repDerivs :: Maybe [LHsType Name] -> DsM (Core [TH.Name])
323 repDerivs Nothing = coreList nameTyConName []
324 repDerivs (Just ctxt)
325 = do { strs <- mapM rep_deriv ctxt ;
326 coreList nameTyConName strs }
328 rep_deriv :: LHsType Name -> DsM (Core TH.Name)
329 -- Deriving clauses must have the simple H98 form
330 rep_deriv (L _ (HsPredTy (HsClassP cls []))) = lookupOcc cls
331 rep_deriv other = notHandled "Non-H98 deriving clause" (ppr other)
334 -------------------------------------------------------
335 -- Signatures in a class decl, or a group of bindings
336 -------------------------------------------------------
338 rep_sigs :: [LSig Name] -> DsM [Core TH.DecQ]
339 rep_sigs sigs = do locs_cores <- rep_sigs' sigs
340 return $ de_loc $ sort_by_loc locs_cores
342 rep_sigs' :: [LSig Name] -> DsM [(SrcSpan, Core TH.DecQ)]
343 -- We silently ignore ones we don't recognise
344 rep_sigs' sigs = do { sigs1 <- mapM rep_sig sigs ;
345 return (concat sigs1) }
347 rep_sig :: LSig Name -> DsM [(SrcSpan, Core TH.DecQ)]
349 -- Empty => Too hard, signature ignored
350 rep_sig (L loc (TypeSig nm ty)) = rep_proto nm ty loc
351 rep_sig other = return []
353 rep_proto :: Located Name -> LHsType Name -> SrcSpan -> DsM [(SrcSpan, Core TH.DecQ)]
354 rep_proto nm ty loc = do { nm1 <- lookupLOcc nm ;
356 sig <- repProto nm1 ty1 ;
357 return [(loc, sig)] }
360 -------------------------------------------------------
362 -------------------------------------------------------
364 -- gensym a list of type variables and enter them into the meta environment;
365 -- the computations passed as the second argument is executed in that extended
366 -- meta environment and gets the *new* names on Core-level as an argument
368 addTyVarBinds :: [LHsTyVarBndr Name] -- the binders to be added
369 -> ([Core TH.Name] -> DsM (Core (TH.Q a))) -- action in the ext env
370 -> DsM (Core (TH.Q a))
371 addTyVarBinds tvs m =
373 let names = map (hsTyVarName.unLoc) tvs
374 freshNames <- mkGenSyms names
375 term <- addBinds freshNames $ do
376 bndrs <- mapM lookupBinder names
378 wrapGenSyns freshNames term
380 -- represent a type context
382 repLContext :: LHsContext Name -> DsM (Core TH.CxtQ)
383 repLContext (L _ ctxt) = repContext ctxt
385 repContext :: HsContext Name -> DsM (Core TH.CxtQ)
387 preds <- mapM repLPred ctxt
388 predList <- coreList typeQTyConName preds
391 -- represent a type predicate
393 repLPred :: LHsPred Name -> DsM (Core TH.TypeQ)
394 repLPred (L _ p) = repPred p
396 repPred :: HsPred Name -> DsM (Core TH.TypeQ)
397 repPred (HsClassP cls tys) = do
398 tcon <- repTy (HsTyVar cls)
401 repPred p@(HsEqualP _ _) = notHandled "Equational constraint" (ppr p)
402 repPred p@(HsIParam _ _) = notHandled "Implicit parameter constraint" (ppr p)
404 -- yield the representation of a list of types
406 repLTys :: [LHsType Name] -> DsM [Core TH.TypeQ]
407 repLTys tys = mapM repLTy tys
411 repLTy :: LHsType Name -> DsM (Core TH.TypeQ)
412 repLTy (L _ ty) = repTy ty
414 repTy :: HsType Name -> DsM (Core TH.TypeQ)
415 repTy (HsForAllTy _ tvs ctxt ty) =
416 addTyVarBinds tvs $ \bndrs -> do
417 ctxt1 <- repLContext ctxt
419 bndrs1 <- coreList nameTyConName bndrs
420 repTForall bndrs1 ctxt1 ty1
423 | isTvOcc (nameOccName n) = do
424 tv1 <- lookupBinder n
429 repTy (HsAppTy f a) = do
433 repTy (HsFunTy f a) = do
436 tcon <- repArrowTyCon
437 repTapps tcon [f1, a1]
438 repTy (HsListTy t) = do
442 repTy (HsPArrTy t) = do
444 tcon <- repTy (HsTyVar (tyConName parrTyCon))
446 repTy (HsTupleTy tc tys) = do
448 tcon <- repTupleTyCon (length tys)
450 repTy (HsOpTy ty1 n ty2) = repLTy ((nlHsTyVar (unLoc n) `nlHsAppTy` ty1)
452 repTy (HsParTy t) = repLTy t
453 repTy (HsPredTy pred) = repPred pred
454 repTy ty@(HsNumTy _) = notHandled "Number types (for generics)" (ppr ty)
455 repTy ty = notHandled "Exotic form of type" (ppr ty)
458 -----------------------------------------------------------------------------
460 -----------------------------------------------------------------------------
462 repLEs :: [LHsExpr Name] -> DsM (Core [TH.ExpQ])
463 repLEs es = do { es' <- mapM repLE es ;
464 coreList expQTyConName es' }
466 -- FIXME: some of these panics should be converted into proper error messages
467 -- unless we can make sure that constructs, which are plainly not
468 -- supported in TH already lead to error messages at an earlier stage
469 repLE :: LHsExpr Name -> DsM (Core TH.ExpQ)
470 repLE (L loc e) = putSrcSpanDs loc (repE e)
472 repE :: HsExpr Name -> DsM (Core TH.ExpQ)
474 do { mb_val <- dsLookupMetaEnv x
476 Nothing -> do { str <- globalVar x
477 ; repVarOrCon x str }
478 Just (Bound y) -> repVarOrCon x (coreVar y)
479 Just (Splice e) -> do { e' <- dsExpr e
480 ; return (MkC e') } }
481 repE e@(HsIPVar x) = notHandled "Implicit parameters" (ppr e)
483 -- Remember, we're desugaring renamer output here, so
484 -- HsOverlit can definitely occur
485 repE (HsOverLit l) = do { a <- repOverloadedLiteral l; repLit a }
486 repE (HsLit l) = do { a <- repLiteral l; repLit a }
487 repE (HsLam (MatchGroup [m] _)) = repLambda m
488 repE (HsApp x y) = do {a <- repLE x; b <- repLE y; repApp a b}
490 repE (OpApp e1 op fix e2) =
491 do { arg1 <- repLE e1;
494 repInfixApp arg1 the_op arg2 }
495 repE (NegApp x nm) = do
497 negateVar <- lookupOcc negateName >>= repVar
499 repE (HsPar x) = repLE x
500 repE (SectionL x y) = do { a <- repLE x; b <- repLE y; repSectionL a b }
501 repE (SectionR x y) = do { a <- repLE x; b <- repLE y; repSectionR a b }
502 repE (HsCase e (MatchGroup ms _)) = do { arg <- repLE e
503 ; ms2 <- mapM repMatchTup ms
504 ; repCaseE arg (nonEmptyCoreList ms2) }
505 repE (HsIf x y z) = do
510 repE (HsLet bs e) = do { (ss,ds) <- repBinds bs
511 ; e2 <- addBinds ss (repLE e)
514 -- FIXME: I haven't got the types here right yet
515 repE (HsDo DoExpr sts body ty)
516 = do { (ss,zs) <- repLSts sts;
517 body' <- addBinds ss $ repLE body;
518 ret <- repNoBindSt body';
519 e <- repDoE (nonEmptyCoreList (zs ++ [ret]));
521 repE (HsDo ListComp sts body ty)
522 = do { (ss,zs) <- repLSts sts;
523 body' <- addBinds ss $ repLE body;
524 ret <- repNoBindSt body';
525 e <- repComp (nonEmptyCoreList (zs ++ [ret]));
527 repE e@(HsDo _ _ _ _) = notHandled "mdo and [: :]" (ppr e)
528 repE (ExplicitList ty es) = do { xs <- repLEs es; repListExp xs }
529 repE e@(ExplicitPArr ty es) = notHandled "Parallel arrays" (ppr e)
530 repE e@(ExplicitTuple es boxed)
531 | isBoxed boxed = do { xs <- repLEs es; repTup xs }
532 | otherwise = notHandled "Unboxed tuples" (ppr e)
533 repE (RecordCon c _ flds)
534 = do { x <- lookupLOcc c;
535 fs <- repFields flds;
537 repE (RecordUpd e flds _ _)
539 fs <- repFields flds;
542 repE (ExprWithTySig e ty) = do { e1 <- repLE e; t1 <- repLTy ty; repSigExp e1 t1 }
543 repE (ArithSeq _ aseq) =
545 From e -> do { ds1 <- repLE e; repFrom ds1 }
554 FromThenTo e1 e2 e3 -> do
558 repFromThenTo ds1 ds2 ds3
559 repE (HsSpliceE (HsSplice n _))
560 = do { mb_val <- dsLookupMetaEnv n
562 Just (Splice e) -> do { e' <- dsExpr e
564 other -> pprPanic "HsSplice" (ppr n) }
565 -- Should not happen; statically checked
567 repE e@(PArrSeq {}) = notHandled "Parallel arrays" (ppr e)
568 repE e@(HsCoreAnn {}) = notHandled "Core annotations" (ppr e)
569 repE e@(HsSCC {}) = notHandled "Cost centres" (ppr e)
570 repE e@(HsTickPragma {}) = notHandled "Tick Pragma" (ppr e)
571 repE e@(HsBracketOut {}) = notHandled "TH brackets" (ppr e)
572 repE e = notHandled "Expression form" (ppr e)
574 -----------------------------------------------------------------------------
575 -- Building representations of auxillary structures like Match, Clause, Stmt,
577 repMatchTup :: LMatch Name -> DsM (Core TH.MatchQ)
578 repMatchTup (L _ (Match [p] ty (GRHSs guards wheres))) =
579 do { ss1 <- mkGenSyms (collectPatBinders p)
580 ; addBinds ss1 $ do {
582 ; (ss2,ds) <- repBinds wheres
583 ; addBinds ss2 $ do {
584 ; gs <- repGuards guards
585 ; match <- repMatch p1 gs ds
586 ; wrapGenSyns (ss1++ss2) match }}}
587 repMatchTup other = panic "repMatchTup: case alt with more than one arg"
589 repClauseTup :: LMatch Name -> DsM (Core TH.ClauseQ)
590 repClauseTup (L _ (Match ps ty (GRHSs guards wheres))) =
591 do { ss1 <- mkGenSyms (collectPatsBinders ps)
592 ; addBinds ss1 $ do {
594 ; (ss2,ds) <- repBinds wheres
595 ; addBinds ss2 $ do {
596 gs <- repGuards guards
597 ; clause <- repClause ps1 gs ds
598 ; wrapGenSyns (ss1++ss2) clause }}}
600 repGuards :: [LGRHS Name] -> DsM (Core TH.BodyQ)
601 repGuards [L _ (GRHS [] e)]
602 = do {a <- repLE e; repNormal a }
604 = do { zs <- mapM process other;
605 let {(xs, ys) = unzip zs};
606 gd <- repGuarded (nonEmptyCoreList ys);
607 wrapGenSyns (concat xs) gd }
609 process :: LGRHS Name -> DsM ([GenSymBind], (Core (TH.Q (TH.Guard, TH.Exp))))
610 process (L _ (GRHS [L _ (ExprStmt e1 _ _)] e2))
611 = do { x <- repLNormalGE e1 e2;
613 process (L _ (GRHS ss rhs))
614 = do (gs, ss') <- repLSts ss
615 rhs' <- addBinds gs $ repLE rhs
616 g <- repPatGE (nonEmptyCoreList ss') rhs'
619 repFields :: [(Located Name, LHsExpr Name)] -> DsM (Core [TH.Q TH.FieldExp])
621 fnames <- mapM lookupLOcc (map fst flds)
622 es <- mapM repLE (map snd flds)
623 fs <- zipWithM repFieldExp fnames es
624 coreList fieldExpQTyConName fs
627 -----------------------------------------------------------------------------
628 -- Representing Stmt's is tricky, especially if bound variables
629 -- shadow each other. Consider: [| do { x <- f 1; x <- f x; g x } |]
630 -- First gensym new names for every variable in any of the patterns.
631 -- both static (x'1 and x'2), and dynamic ((gensym "x") and (gensym "y"))
632 -- if variables didn't shaddow, the static gensym wouldn't be necessary
633 -- and we could reuse the original names (x and x).
635 -- do { x'1 <- gensym "x"
636 -- ; x'2 <- gensym "x"
637 -- ; doE [ BindSt (pvar x'1) [| f 1 |]
638 -- , BindSt (pvar x'2) [| f x |]
639 -- , NoBindSt [| g x |]
643 -- The strategy is to translate a whole list of do-bindings by building a
644 -- bigger environment, and a bigger set of meta bindings
645 -- (like: x'1 <- gensym "x" ) and then combining these with the translations
646 -- of the expressions within the Do
648 -----------------------------------------------------------------------------
649 -- The helper function repSts computes the translation of each sub expression
650 -- and a bunch of prefix bindings denoting the dynamic renaming.
652 repLSts :: [LStmt Name] -> DsM ([GenSymBind], [Core TH.StmtQ])
653 repLSts stmts = repSts (map unLoc stmts)
655 repSts :: [Stmt Name] -> DsM ([GenSymBind], [Core TH.StmtQ])
656 repSts (BindStmt p e _ _ : ss) =
658 ; ss1 <- mkGenSyms (collectPatBinders p)
659 ; addBinds ss1 $ do {
661 ; (ss2,zs) <- repSts ss
662 ; z <- repBindSt p1 e2
663 ; return (ss1++ss2, z : zs) }}
664 repSts (LetStmt bs : ss) =
665 do { (ss1,ds) <- repBinds bs
667 ; (ss2,zs) <- addBinds ss1 (repSts ss)
668 ; return (ss1++ss2, z : zs) }
669 repSts (ExprStmt e _ _ : ss) =
671 ; z <- repNoBindSt e2
672 ; (ss2,zs) <- repSts ss
673 ; return (ss2, z : zs) }
674 repSts [] = return ([],[])
675 repSts other = notHandled "Exotic statement" (ppr other)
678 -----------------------------------------------------------
680 -----------------------------------------------------------
682 repBinds :: HsLocalBinds Name -> DsM ([GenSymBind], Core [TH.DecQ])
683 repBinds EmptyLocalBinds
684 = do { core_list <- coreList decQTyConName []
685 ; return ([], core_list) }
687 repBinds b@(HsIPBinds _) = notHandled "Implicit parameters" (ppr b)
689 repBinds (HsValBinds decs)
690 = do { let { bndrs = map unLoc (collectHsValBinders decs) }
691 -- No need to worrry about detailed scopes within
692 -- the binding group, because we are talking Names
693 -- here, so we can safely treat it as a mutually
695 ; ss <- mkGenSyms bndrs
696 ; prs <- addBinds ss (rep_val_binds decs)
697 ; core_list <- coreList decQTyConName
698 (de_loc (sort_by_loc prs))
699 ; return (ss, core_list) }
701 rep_val_binds :: HsValBinds Name -> DsM [(SrcSpan, Core TH.DecQ)]
702 -- Assumes: all the binders of the binding are alrady in the meta-env
703 rep_val_binds (ValBindsOut binds sigs)
704 = do { core1 <- rep_binds' (unionManyBags (map snd binds))
705 ; core2 <- rep_sigs' sigs
706 ; return (core1 ++ core2) }
707 rep_val_binds (ValBindsOut binds sigs)
708 = panic "rep_val_binds: ValBindsOut"
710 rep_binds :: LHsBinds Name -> DsM [Core TH.DecQ]
711 rep_binds binds = do { binds_w_locs <- rep_binds' binds
712 ; return (de_loc (sort_by_loc binds_w_locs)) }
714 rep_binds' :: LHsBinds Name -> DsM [(SrcSpan, Core TH.DecQ)]
715 rep_binds' binds = mapM rep_bind (bagToList binds)
717 rep_bind :: LHsBind Name -> DsM (SrcSpan, Core TH.DecQ)
718 -- Assumes: all the binders of the binding are alrady in the meta-env
720 -- Note GHC treats declarations of a variable (not a pattern)
721 -- e.g. x = g 5 as a Fun MonoBinds. This is indicated by a single match
722 -- with an empty list of patterns
723 rep_bind (L loc (FunBind { fun_id = fn,
724 fun_matches = MatchGroup [L _ (Match [] ty (GRHSs guards wheres))] _ }))
725 = do { (ss,wherecore) <- repBinds wheres
726 ; guardcore <- addBinds ss (repGuards guards)
727 ; fn' <- lookupLBinder fn
729 ; ans <- repVal p guardcore wherecore
730 ; ans' <- wrapGenSyns ss ans
731 ; return (loc, ans') }
733 rep_bind (L loc (FunBind { fun_id = fn, fun_matches = MatchGroup ms _ }))
734 = do { ms1 <- mapM repClauseTup ms
735 ; fn' <- lookupLBinder fn
736 ; ans <- repFun fn' (nonEmptyCoreList ms1)
737 ; return (loc, ans) }
739 rep_bind (L loc (PatBind { pat_lhs = pat, pat_rhs = GRHSs guards wheres }))
740 = do { patcore <- repLP pat
741 ; (ss,wherecore) <- repBinds wheres
742 ; guardcore <- addBinds ss (repGuards guards)
743 ; ans <- repVal patcore guardcore wherecore
744 ; ans' <- wrapGenSyns ss ans
745 ; return (loc, ans') }
747 rep_bind (L loc (VarBind { var_id = v, var_rhs = e}))
748 = do { v' <- lookupBinder v
751 ; patcore <- repPvar v'
752 ; empty_decls <- coreList decQTyConName []
753 ; ans <- repVal patcore x empty_decls
754 ; return (srcLocSpan (getSrcLoc v), ans) }
756 rep_bind other = panic "rep_bind: AbsBinds"
758 -----------------------------------------------------------------------------
759 -- Since everything in a Bind is mutually recursive we need rename all
760 -- all the variables simultaneously. For example:
761 -- [| AndMonoBinds (f x = x + g 2) (g x = f 1 + 2) |] would translate to
762 -- do { f'1 <- gensym "f"
763 -- ; g'2 <- gensym "g"
764 -- ; [ do { x'3 <- gensym "x"; fun f'1 [pvar x'3] [| x + g2 |]},
765 -- do { x'4 <- gensym "x"; fun g'2 [pvar x'4] [| f 1 + 2 |]}
767 -- This requires collecting the bindings (f'1 <- gensym "f"), and the
768 -- environment ( f |-> f'1 ) from each binding, and then unioning them
769 -- together. As we do this we collect GenSymBinds's which represent the renamed
770 -- variables bound by the Bindings. In order not to lose track of these
771 -- representations we build a shadow datatype MB with the same structure as
772 -- MonoBinds, but which has slots for the representations
775 -----------------------------------------------------------------------------
776 -- GHC allows a more general form of lambda abstraction than specified
777 -- by Haskell 98. In particular it allows guarded lambda's like :
778 -- (\ x | even x -> 0 | odd x -> 1) at the moment we can't represent this in
779 -- Haskell Template's Meta.Exp type so we punt if it isn't a simple thing like
780 -- (\ p1 .. pn -> exp) by causing an error.
782 repLambda :: LMatch Name -> DsM (Core TH.ExpQ)
783 repLambda (L _ (Match ps _ (GRHSs [L _ (GRHS [] e)] EmptyLocalBinds)))
784 = do { let bndrs = collectPatsBinders ps ;
785 ; ss <- mkGenSyms bndrs
786 ; lam <- addBinds ss (
787 do { xs <- repLPs ps; body <- repLE e; repLam xs body })
788 ; wrapGenSyns ss lam }
790 repLambda (L _ m) = notHandled "Guarded labmdas" (pprMatch LambdaExpr m)
793 -----------------------------------------------------------------------------
795 -- repP deals with patterns. It assumes that we have already
796 -- walked over the pattern(s) once to collect the binders, and
797 -- have extended the environment. So every pattern-bound
798 -- variable should already appear in the environment.
800 -- Process a list of patterns
801 repLPs :: [LPat Name] -> DsM (Core [TH.PatQ])
802 repLPs ps = do { ps' <- mapM repLP ps ;
803 coreList patQTyConName ps' }
805 repLP :: LPat Name -> DsM (Core TH.PatQ)
806 repLP (L _ p) = repP p
808 repP :: Pat Name -> DsM (Core TH.PatQ)
809 repP (WildPat _) = repPwild
810 repP (LitPat l) = do { l2 <- repLiteral l; repPlit l2 }
811 repP (VarPat x) = do { x' <- lookupBinder x; repPvar x' }
812 repP (LazyPat p) = do { p1 <- repLP p; repPtilde p1 }
813 repP (AsPat x p) = do { x' <- lookupLBinder x; p1 <- repLP p; repPaspat x' p1 }
814 repP (ParPat p) = repLP p
815 repP (ListPat ps _) = do { qs <- repLPs ps; repPlist qs }
816 repP (TuplePat ps _ _) = do { qs <- repLPs ps; repPtup qs }
817 repP (ConPatIn dc details)
818 = do { con_str <- lookupLOcc dc
820 PrefixCon ps -> do { qs <- repLPs ps; repPcon con_str qs }
821 RecCon pairs -> do { vs <- sequence $ map lookupLOcc (map hsRecFieldId pairs)
822 ; ps <- sequence $ map repLP (map hsRecFieldArg pairs)
823 ; fps <- zipWithM (\x y -> rep2 fieldPatName [unC x,unC y]) vs ps
824 ; fps' <- coreList fieldPatQTyConName fps
825 ; repPrec con_str fps' }
826 InfixCon p1 p2 -> do { p1' <- repLP p1;
828 repPinfix p1' con_str p2' }
830 repP (NPat l Nothing _ _) = do { a <- repOverloadedLiteral l; repPlit a }
831 repP p@(NPat l (Just _) _ _) = notHandled "Negative overloaded patterns" (ppr p)
832 repP p@(SigPatIn {}) = notHandled "Type signatures in patterns" (ppr p)
833 -- The problem is to do with scoped type variables.
834 -- To implement them, we have to implement the scoping rules
835 -- here in DsMeta, and I don't want to do that today!
836 -- do { p' <- repLP p; t' <- repLTy t; repPsig p' t' }
837 -- repPsig :: Core TH.PatQ -> Core TH.TypeQ -> DsM (Core TH.PatQ)
838 -- repPsig (MkC p) (MkC t) = rep2 sigPName [p, t]
840 repP other = notHandled "Exotic pattern" (ppr other)
842 ----------------------------------------------------------
843 -- Declaration ordering helpers
845 sort_by_loc :: [(SrcSpan, a)] -> [(SrcSpan, a)]
846 sort_by_loc xs = sortBy comp xs
847 where comp x y = compare (fst x) (fst y)
849 de_loc :: [(a, b)] -> [b]
852 ----------------------------------------------------------
853 -- The meta-environment
855 -- A name/identifier association for fresh names of locally bound entities
856 type GenSymBind = (Name, Id) -- Gensym the string and bind it to the Id
857 -- I.e. (x, x_id) means
858 -- let x_id = gensym "x" in ...
860 -- Generate a fresh name for a locally bound entity
862 mkGenSyms :: [Name] -> DsM [GenSymBind]
863 -- We can use the existing name. For example:
864 -- [| \x_77 -> x_77 + x_77 |]
866 -- do { x_77 <- genSym "x"; .... }
867 -- We use the same x_77 in the desugared program, but with the type Bndr
870 -- We do make it an Internal name, though (hence localiseName)
872 -- Nevertheless, it's monadic because we have to generate nameTy
873 mkGenSyms ns = do { var_ty <- lookupType nameTyConName
874 ; return [(nm, mkLocalId (localiseName nm) var_ty) | nm <- ns] }
877 addBinds :: [GenSymBind] -> DsM a -> DsM a
878 -- Add a list of fresh names for locally bound entities to the
879 -- meta environment (which is part of the state carried around
880 -- by the desugarer monad)
881 addBinds bs m = dsExtendMetaEnv (mkNameEnv [(n,Bound id) | (n,id) <- bs]) m
883 -- Look up a locally bound name
885 lookupLBinder :: Located Name -> DsM (Core TH.Name)
886 lookupLBinder (L _ n) = lookupBinder n
888 lookupBinder :: Name -> DsM (Core TH.Name)
890 = do { mb_val <- dsLookupMetaEnv n;
892 Just (Bound x) -> return (coreVar x)
893 other -> failWithDs msg }
895 msg = ptext SLIT("DsMeta: failed binder lookup when desugaring a TH bracket:") <+> ppr n
897 -- Look up a name that is either locally bound or a global name
899 -- * If it is a global name, generate the "original name" representation (ie,
900 -- the <module>:<name> form) for the associated entity
902 lookupLOcc :: Located Name -> DsM (Core TH.Name)
903 -- Lookup an occurrence; it can't be a splice.
904 -- Use the in-scope bindings if they exist
905 lookupLOcc (L _ n) = lookupOcc n
907 lookupOcc :: Name -> DsM (Core TH.Name)
909 = do { mb_val <- dsLookupMetaEnv n ;
911 Nothing -> globalVar n
912 Just (Bound x) -> return (coreVar x)
913 Just (Splice _) -> pprPanic "repE:lookupOcc" (ppr n)
916 globalVar :: Name -> DsM (Core TH.Name)
917 -- Not bound by the meta-env
918 -- Could be top-level; or could be local
919 -- f x = $(g [| x |])
920 -- Here the x will be local
922 | isExternalName name
923 = do { MkC mod <- coreStringLit name_mod
924 ; MkC pkg <- coreStringLit name_pkg
925 ; MkC occ <- occNameLit name
926 ; rep2 mk_varg [pkg,mod,occ] }
928 = do { MkC occ <- occNameLit name
929 ; MkC uni <- coreIntLit (getKey (getUnique name))
930 ; rep2 mkNameLName [occ,uni] }
932 mod = nameModule name
933 name_mod = moduleNameString (moduleName mod)
934 name_pkg = packageIdString (modulePackageId mod)
935 name_occ = nameOccName name
936 mk_varg | OccName.isDataOcc name_occ = mkNameG_dName
937 | OccName.isVarOcc name_occ = mkNameG_vName
938 | OccName.isTcOcc name_occ = mkNameG_tcName
939 | otherwise = pprPanic "DsMeta.globalVar" (ppr name)
941 lookupType :: Name -- Name of type constructor (e.g. TH.ExpQ)
942 -> DsM Type -- The type
943 lookupType tc_name = do { tc <- dsLookupTyCon tc_name ;
944 return (mkTyConApp tc []) }
946 wrapGenSyns :: [GenSymBind]
947 -> Core (TH.Q a) -> DsM (Core (TH.Q a))
948 -- wrapGenSyns [(nm1,id1), (nm2,id2)] y
949 -- --> bindQ (gensym nm1) (\ id1 ->
950 -- bindQ (gensym nm2 (\ id2 ->
953 wrapGenSyns binds body@(MkC b)
954 = do { var_ty <- lookupType nameTyConName
957 [elt_ty] = tcTyConAppArgs (exprType b)
958 -- b :: Q a, so we can get the type 'a' by looking at the
959 -- argument type. NB: this relies on Q being a data/newtype,
960 -- not a type synonym
962 go var_ty [] = return body
963 go var_ty ((name,id) : binds)
964 = do { MkC body' <- go var_ty binds
965 ; lit_str <- occNameLit name
966 ; gensym_app <- repGensym lit_str
967 ; repBindQ var_ty elt_ty
968 gensym_app (MkC (Lam id body')) }
970 -- Just like wrapGenSym, but don't actually do the gensym
971 -- Instead use the existing name:
972 -- let x = "x" in ...
973 -- Only used for [Decl], and for the class ops in class
974 -- and instance decls
975 wrapNongenSyms :: [GenSymBind] -> Core a -> DsM (Core a)
976 wrapNongenSyms binds (MkC body)
977 = do { binds' <- mapM do_one binds ;
978 return (MkC (mkLets binds' body)) }
981 = do { MkC lit_str <- occNameLit name
982 ; MkC var <- rep2 mkNameName [lit_str]
983 ; return (NonRec id var) }
985 occNameLit :: Name -> DsM (Core String)
986 occNameLit n = coreStringLit (occNameString (nameOccName n))
989 -- %*********************************************************************
993 -- %*********************************************************************
995 -----------------------------------------------------------------------------
996 -- PHANTOM TYPES for consistency. In order to make sure we do this correct
997 -- we invent a new datatype which uses phantom types.
999 newtype Core a = MkC CoreExpr
1002 rep2 :: Name -> [ CoreExpr ] -> DsM (Core a)
1003 rep2 n xs = do { id <- dsLookupGlobalId n
1004 ; return (MkC (foldl App (Var id) xs)) }
1006 -- Then we make "repConstructors" which use the phantom types for each of the
1007 -- smart constructors of the Meta.Meta datatypes.
1010 -- %*********************************************************************
1012 -- The 'smart constructors'
1014 -- %*********************************************************************
1016 --------------- Patterns -----------------
1017 repPlit :: Core TH.Lit -> DsM (Core TH.PatQ)
1018 repPlit (MkC l) = rep2 litPName [l]
1020 repPvar :: Core TH.Name -> DsM (Core TH.PatQ)
1021 repPvar (MkC s) = rep2 varPName [s]
1023 repPtup :: Core [TH.PatQ] -> DsM (Core TH.PatQ)
1024 repPtup (MkC ps) = rep2 tupPName [ps]
1026 repPcon :: Core TH.Name -> Core [TH.PatQ] -> DsM (Core TH.PatQ)
1027 repPcon (MkC s) (MkC ps) = rep2 conPName [s, ps]
1029 repPrec :: Core TH.Name -> Core [(TH.Name,TH.PatQ)] -> DsM (Core TH.PatQ)
1030 repPrec (MkC c) (MkC rps) = rep2 recPName [c,rps]
1032 repPinfix :: Core TH.PatQ -> Core TH.Name -> Core TH.PatQ -> DsM (Core TH.PatQ)
1033 repPinfix (MkC p1) (MkC n) (MkC p2) = rep2 infixPName [p1, n, p2]
1035 repPtilde :: Core TH.PatQ -> DsM (Core TH.PatQ)
1036 repPtilde (MkC p) = rep2 tildePName [p]
1038 repPaspat :: Core TH.Name -> Core TH.PatQ -> DsM (Core TH.PatQ)
1039 repPaspat (MkC s) (MkC p) = rep2 asPName [s, p]
1041 repPwild :: DsM (Core TH.PatQ)
1042 repPwild = rep2 wildPName []
1044 repPlist :: Core [TH.PatQ] -> DsM (Core TH.PatQ)
1045 repPlist (MkC ps) = rep2 listPName [ps]
1047 --------------- Expressions -----------------
1048 repVarOrCon :: Name -> Core TH.Name -> DsM (Core TH.ExpQ)
1049 repVarOrCon vc str | isDataOcc (nameOccName vc) = repCon str
1050 | otherwise = repVar str
1052 repVar :: Core TH.Name -> DsM (Core TH.ExpQ)
1053 repVar (MkC s) = rep2 varEName [s]
1055 repCon :: Core TH.Name -> DsM (Core TH.ExpQ)
1056 repCon (MkC s) = rep2 conEName [s]
1058 repLit :: Core TH.Lit -> DsM (Core TH.ExpQ)
1059 repLit (MkC c) = rep2 litEName [c]
1061 repApp :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1062 repApp (MkC x) (MkC y) = rep2 appEName [x,y]
1064 repLam :: Core [TH.PatQ] -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1065 repLam (MkC ps) (MkC e) = rep2 lamEName [ps, e]
1067 repTup :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)
1068 repTup (MkC es) = rep2 tupEName [es]
1070 repCond :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1071 repCond (MkC x) (MkC y) (MkC z) = rep2 condEName [x,y,z]
1073 repLetE :: Core [TH.DecQ] -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1074 repLetE (MkC ds) (MkC e) = rep2 letEName [ds, e]
1076 repCaseE :: Core TH.ExpQ -> Core [TH.MatchQ] -> DsM( Core TH.ExpQ)
1077 repCaseE (MkC e) (MkC ms) = rep2 caseEName [e, ms]
1079 repDoE :: Core [TH.StmtQ] -> DsM (Core TH.ExpQ)
1080 repDoE (MkC ss) = rep2 doEName [ss]
1082 repComp :: Core [TH.StmtQ] -> DsM (Core TH.ExpQ)
1083 repComp (MkC ss) = rep2 compEName [ss]
1085 repListExp :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)
1086 repListExp (MkC es) = rep2 listEName [es]
1088 repSigExp :: Core TH.ExpQ -> Core TH.TypeQ -> DsM (Core TH.ExpQ)
1089 repSigExp (MkC e) (MkC t) = rep2 sigEName [e,t]
1091 repRecCon :: Core TH.Name -> Core [TH.Q TH.FieldExp]-> DsM (Core TH.ExpQ)
1092 repRecCon (MkC c) (MkC fs) = rep2 recConEName [c,fs]
1094 repRecUpd :: Core TH.ExpQ -> Core [TH.Q TH.FieldExp] -> DsM (Core TH.ExpQ)
1095 repRecUpd (MkC e) (MkC fs) = rep2 recUpdEName [e,fs]
1097 repFieldExp :: Core TH.Name -> Core TH.ExpQ -> DsM (Core (TH.Q TH.FieldExp))
1098 repFieldExp (MkC n) (MkC x) = rep2 fieldExpName [n,x]
1100 repInfixApp :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1101 repInfixApp (MkC x) (MkC y) (MkC z) = rep2 infixAppName [x,y,z]
1103 repSectionL :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1104 repSectionL (MkC x) (MkC y) = rep2 sectionLName [x,y]
1106 repSectionR :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1107 repSectionR (MkC x) (MkC y) = rep2 sectionRName [x,y]
1109 ------------ Right hand sides (guarded expressions) ----
1110 repGuarded :: Core [TH.Q (TH.Guard, TH.Exp)] -> DsM (Core TH.BodyQ)
1111 repGuarded (MkC pairs) = rep2 guardedBName [pairs]
1113 repNormal :: Core TH.ExpQ -> DsM (Core TH.BodyQ)
1114 repNormal (MkC e) = rep2 normalBName [e]
1116 ------------ Guards ----
1117 repLNormalGE :: LHsExpr Name -> LHsExpr Name -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1118 repLNormalGE g e = do g' <- repLE g
1122 repNormalGE :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1123 repNormalGE (MkC g) (MkC e) = rep2 normalGEName [g, e]
1125 repPatGE :: Core [TH.StmtQ] -> Core TH.ExpQ -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1126 repPatGE (MkC ss) (MkC e) = rep2 patGEName [ss, e]
1128 ------------- Stmts -------------------
1129 repBindSt :: Core TH.PatQ -> Core TH.ExpQ -> DsM (Core TH.StmtQ)
1130 repBindSt (MkC p) (MkC e) = rep2 bindSName [p,e]
1132 repLetSt :: Core [TH.DecQ] -> DsM (Core TH.StmtQ)
1133 repLetSt (MkC ds) = rep2 letSName [ds]
1135 repNoBindSt :: Core TH.ExpQ -> DsM (Core TH.StmtQ)
1136 repNoBindSt (MkC e) = rep2 noBindSName [e]
1138 -------------- Range (Arithmetic sequences) -----------
1139 repFrom :: Core TH.ExpQ -> DsM (Core TH.ExpQ)
1140 repFrom (MkC x) = rep2 fromEName [x]
1142 repFromThen :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1143 repFromThen (MkC x) (MkC y) = rep2 fromThenEName [x,y]
1145 repFromTo :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1146 repFromTo (MkC x) (MkC y) = rep2 fromToEName [x,y]
1148 repFromThenTo :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1149 repFromThenTo (MkC x) (MkC y) (MkC z) = rep2 fromThenToEName [x,y,z]
1151 ------------ Match and Clause Tuples -----------
1152 repMatch :: Core TH.PatQ -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.MatchQ)
1153 repMatch (MkC p) (MkC bod) (MkC ds) = rep2 matchName [p, bod, ds]
1155 repClause :: Core [TH.PatQ] -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.ClauseQ)
1156 repClause (MkC ps) (MkC bod) (MkC ds) = rep2 clauseName [ps, bod, ds]
1158 -------------- Dec -----------------------------
1159 repVal :: Core TH.PatQ -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1160 repVal (MkC p) (MkC b) (MkC ds) = rep2 valDName [p, b, ds]
1162 repFun :: Core TH.Name -> Core [TH.ClauseQ] -> DsM (Core TH.DecQ)
1163 repFun (MkC nm) (MkC b) = rep2 funDName [nm, b]
1165 repData :: Core TH.CxtQ -> Core TH.Name -> Core [TH.Name] -> Core [TH.ConQ] -> Core [TH.Name] -> DsM (Core TH.DecQ)
1166 repData (MkC cxt) (MkC nm) (MkC tvs) (MkC cons) (MkC derivs)
1167 = rep2 dataDName [cxt, nm, tvs, cons, derivs]
1169 repNewtype :: Core TH.CxtQ -> Core TH.Name -> Core [TH.Name] -> Core TH.ConQ -> Core [TH.Name] -> DsM (Core TH.DecQ)
1170 repNewtype (MkC cxt) (MkC nm) (MkC tvs) (MkC con) (MkC derivs)
1171 = rep2 newtypeDName [cxt, nm, tvs, con, derivs]
1173 repTySyn :: Core TH.Name -> Core [TH.Name] -> Core TH.TypeQ -> DsM (Core TH.DecQ)
1174 repTySyn (MkC nm) (MkC tvs) (MkC rhs) = rep2 tySynDName [nm, tvs, rhs]
1176 repInst :: Core TH.CxtQ -> Core TH.TypeQ -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1177 repInst (MkC cxt) (MkC ty) (MkC ds) = rep2 instanceDName [cxt, ty, ds]
1179 repClass :: Core TH.CxtQ -> Core TH.Name -> Core [TH.Name] -> Core [TH.FunDep] -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1180 repClass (MkC cxt) (MkC cls) (MkC tvs) (MkC fds) (MkC ds) = rep2 classDName [cxt, cls, tvs, fds, ds]
1182 repFunDep :: Core [TH.Name] -> Core [TH.Name] -> DsM (Core TH.FunDep)
1183 repFunDep (MkC xs) (MkC ys) = rep2 funDepName [xs, ys]
1185 repProto :: Core TH.Name -> Core TH.TypeQ -> DsM (Core TH.DecQ)
1186 repProto (MkC s) (MkC ty) = rep2 sigDName [s, ty]
1188 repCtxt :: Core [TH.TypeQ] -> DsM (Core TH.CxtQ)
1189 repCtxt (MkC tys) = rep2 cxtName [tys]
1191 repConstr :: Core TH.Name -> HsConDetails Name (LBangType Name)
1192 -> DsM (Core TH.ConQ)
1193 repConstr con (PrefixCon ps)
1194 = do arg_tys <- mapM repBangTy ps
1195 arg_tys1 <- coreList strictTypeQTyConName arg_tys
1196 rep2 normalCName [unC con, unC arg_tys1]
1197 repConstr con (RecCon ips)
1198 = do arg_vs <- mapM lookupLOcc (map hsRecFieldId ips)
1199 arg_tys <- mapM repBangTy (map hsRecFieldArg ips)
1200 arg_vtys <- zipWithM (\x y -> rep2 varStrictTypeName [unC x, unC y])
1202 arg_vtys' <- coreList varStrictTypeQTyConName arg_vtys
1203 rep2 recCName [unC con, unC arg_vtys']
1204 repConstr con (InfixCon st1 st2)
1205 = do arg1 <- repBangTy st1
1206 arg2 <- repBangTy st2
1207 rep2 infixCName [unC arg1, unC con, unC arg2]
1209 ------------ Types -------------------
1211 repTForall :: Core [TH.Name] -> Core TH.CxtQ -> Core TH.TypeQ -> DsM (Core TH.TypeQ)
1212 repTForall (MkC tvars) (MkC ctxt) (MkC ty)
1213 = rep2 forallTName [tvars, ctxt, ty]
1215 repTvar :: Core TH.Name -> DsM (Core TH.TypeQ)
1216 repTvar (MkC s) = rep2 varTName [s]
1218 repTapp :: Core TH.TypeQ -> Core TH.TypeQ -> DsM (Core TH.TypeQ)
1219 repTapp (MkC t1) (MkC t2) = rep2 appTName [t1,t2]
1221 repTapps :: Core TH.TypeQ -> [Core TH.TypeQ] -> DsM (Core TH.TypeQ)
1222 repTapps f [] = return f
1223 repTapps f (t:ts) = do { f1 <- repTapp f t; repTapps f1 ts }
1225 --------- Type constructors --------------
1227 repNamedTyCon :: Core TH.Name -> DsM (Core TH.TypeQ)
1228 repNamedTyCon (MkC s) = rep2 conTName [s]
1230 repTupleTyCon :: Int -> DsM (Core TH.TypeQ)
1231 -- Note: not Core Int; it's easier to be direct here
1232 repTupleTyCon i = rep2 tupleTName [mkIntExpr (fromIntegral i)]
1234 repArrowTyCon :: DsM (Core TH.TypeQ)
1235 repArrowTyCon = rep2 arrowTName []
1237 repListTyCon :: DsM (Core TH.TypeQ)
1238 repListTyCon = rep2 listTName []
1241 ----------------------------------------------------------
1244 repLiteral :: HsLit -> DsM (Core TH.Lit)
1246 = do lit' <- case lit of
1247 HsIntPrim i -> mk_integer i
1248 HsInt i -> mk_integer i
1249 HsFloatPrim r -> mk_rational r
1250 HsDoublePrim r -> mk_rational r
1252 lit_expr <- dsLit lit'
1254 Just lit_name -> rep2 lit_name [lit_expr]
1255 Nothing -> notHandled "Exotic literal" (ppr lit)
1257 mb_lit_name = case lit of
1258 HsInteger _ _ -> Just integerLName
1259 HsInt _ -> Just integerLName
1260 HsIntPrim _ -> Just intPrimLName
1261 HsFloatPrim _ -> Just floatPrimLName
1262 HsDoublePrim _ -> Just doublePrimLName
1263 HsChar _ -> Just charLName
1264 HsString _ -> Just stringLName
1265 HsRat _ _ -> Just rationalLName
1268 mk_integer i = do integer_ty <- lookupType integerTyConName
1269 return $ HsInteger i integer_ty
1270 mk_rational r = do rat_ty <- lookupType rationalTyConName
1271 return $ HsRat r rat_ty
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 -- The type Rational will be in the environment, becuase
1277 -- the smart constructor 'TH.Syntax.rationalL' uses it in its type,
1278 -- and rationalL is sucked in when any TH stuff is used
1280 --------------- Miscellaneous -------------------
1282 repGensym :: Core String -> DsM (Core (TH.Q TH.Name))
1283 repGensym (MkC lit_str) = rep2 newNameName [lit_str]
1285 repBindQ :: Type -> Type -- a and b
1286 -> Core (TH.Q a) -> Core (a -> TH.Q b) -> DsM (Core (TH.Q b))
1287 repBindQ ty_a ty_b (MkC x) (MkC y)
1288 = rep2 bindQName [Type ty_a, Type ty_b, x, y]
1290 repSequenceQ :: Type -> Core [TH.Q a] -> DsM (Core (TH.Q [a]))
1291 repSequenceQ ty_a (MkC list)
1292 = rep2 sequenceQName [Type ty_a, list]
1294 ------------ Lists and Tuples -------------------
1295 -- turn a list of patterns into a single pattern matching a list
1297 coreList :: Name -- Of the TyCon of the element type
1298 -> [Core a] -> DsM (Core [a])
1300 = do { elt_ty <- lookupType tc_name; return (coreList' elt_ty es) }
1302 coreList' :: Type -- The element type
1303 -> [Core a] -> Core [a]
1304 coreList' elt_ty es = MkC (mkListExpr elt_ty (map unC es ))
1306 nonEmptyCoreList :: [Core a] -> Core [a]
1307 -- The list must be non-empty so we can get the element type
1308 -- Otherwise use coreList
1309 nonEmptyCoreList [] = panic "coreList: empty argument"
1310 nonEmptyCoreList xs@(MkC x:_) = MkC (mkListExpr (exprType x) (map unC xs))
1312 corePair :: (Core a, Core b) -> Core (a,b)
1313 corePair (MkC x, MkC y) = MkC (mkCoreTup [x,y])
1315 coreStringLit :: String -> DsM (Core String)
1316 coreStringLit s = do { z <- mkStringExpr s; return(MkC z) }
1318 coreIntLit :: Int -> DsM (Core Int)
1319 coreIntLit i = return (MkC (mkIntExpr (fromIntegral i)))
1321 coreVar :: Id -> Core TH.Name -- The Id has type Name
1322 coreVar id = MkC (Var id)
1324 ----------------- Failure -----------------------
1325 notHandled :: String -> SDoc -> DsM a
1326 notHandled what doc = failWithDs msg
1328 msg = hang (text what <+> ptext SLIT("not (yet) handled by Template Haskell"))
1332 -- %************************************************************************
1334 -- The known-key names for Template Haskell
1336 -- %************************************************************************
1338 -- To add a name, do three things
1340 -- 1) Allocate a key
1342 -- 3) Add the name to knownKeyNames
1344 templateHaskellNames :: [Name]
1345 -- The names that are implicitly mentioned by ``bracket''
1346 -- Should stay in sync with the import list of DsMeta
1348 templateHaskellNames = [
1349 returnQName, bindQName, sequenceQName, newNameName, liftName,
1350 mkNameName, mkNameG_vName, mkNameG_dName, mkNameG_tcName, mkNameLName,
1353 charLName, stringLName, integerLName, intPrimLName,
1354 floatPrimLName, doublePrimLName, rationalLName,
1356 litPName, varPName, tupPName, conPName, tildePName, infixPName,
1357 asPName, wildPName, recPName, listPName, sigPName,
1365 varEName, conEName, litEName, appEName, infixEName,
1366 infixAppName, sectionLName, sectionRName, lamEName, tupEName,
1367 condEName, letEName, caseEName, doEName, compEName,
1368 fromEName, fromThenEName, fromToEName, fromThenToEName,
1369 listEName, sigEName, recConEName, recUpdEName,
1373 guardedBName, normalBName,
1375 normalGEName, patGEName,
1377 bindSName, letSName, noBindSName, parSName,
1379 funDName, valDName, dataDName, newtypeDName, tySynDName,
1380 classDName, instanceDName, sigDName, forImpDName,
1384 isStrictName, notStrictName,
1386 normalCName, recCName, infixCName, forallCName,
1392 forallTName, varTName, conTName, appTName,
1393 tupleTName, arrowTName, listTName,
1395 cCallName, stdCallName,
1404 qTyConName, nameTyConName, patTyConName, fieldPatTyConName, matchQTyConName,
1405 clauseQTyConName, expQTyConName, fieldExpTyConName, stmtQTyConName,
1406 decQTyConName, conQTyConName, strictTypeQTyConName,
1407 varStrictTypeQTyConName, typeQTyConName, expTyConName, decTyConName,
1408 typeTyConName, matchTyConName, clauseTyConName, patQTyConName,
1409 fieldPatQTyConName, fieldExpQTyConName, funDepTyConName]
1412 thSyn = mkTHModule FSLIT("Language.Haskell.TH.Syntax")
1413 thLib = mkTHModule FSLIT("Language.Haskell.TH.Lib")
1415 mkTHModule m = mkModule thPackageId (mkModuleNameFS m)
1417 libFun = mk_known_key_name OccName.varName thLib
1418 libTc = mk_known_key_name OccName.tcName thLib
1419 thFun = mk_known_key_name OccName.varName thSyn
1420 thTc = mk_known_key_name OccName.tcName thSyn
1422 -------------------- TH.Syntax -----------------------
1423 qTyConName = thTc FSLIT("Q") qTyConKey
1424 nameTyConName = thTc FSLIT("Name") nameTyConKey
1425 fieldExpTyConName = thTc FSLIT("FieldExp") fieldExpTyConKey
1426 patTyConName = thTc FSLIT("Pat") patTyConKey
1427 fieldPatTyConName = thTc FSLIT("FieldPat") fieldPatTyConKey
1428 expTyConName = thTc FSLIT("Exp") expTyConKey
1429 decTyConName = thTc FSLIT("Dec") decTyConKey
1430 typeTyConName = thTc FSLIT("Type") typeTyConKey
1431 matchTyConName = thTc FSLIT("Match") matchTyConKey
1432 clauseTyConName = thTc FSLIT("Clause") clauseTyConKey
1433 funDepTyConName = thTc FSLIT("FunDep") funDepTyConKey
1435 returnQName = thFun FSLIT("returnQ") returnQIdKey
1436 bindQName = thFun FSLIT("bindQ") bindQIdKey
1437 sequenceQName = thFun FSLIT("sequenceQ") sequenceQIdKey
1438 newNameName = thFun FSLIT("newName") newNameIdKey
1439 liftName = thFun FSLIT("lift") liftIdKey
1440 mkNameName = thFun FSLIT("mkName") mkNameIdKey
1441 mkNameG_vName = thFun FSLIT("mkNameG_v") mkNameG_vIdKey
1442 mkNameG_dName = thFun FSLIT("mkNameG_d") mkNameG_dIdKey
1443 mkNameG_tcName = thFun FSLIT("mkNameG_tc") mkNameG_tcIdKey
1444 mkNameLName = thFun FSLIT("mkNameL") mkNameLIdKey
1447 -------------------- TH.Lib -----------------------
1449 charLName = libFun FSLIT("charL") charLIdKey
1450 stringLName = libFun FSLIT("stringL") stringLIdKey
1451 integerLName = libFun FSLIT("integerL") integerLIdKey
1452 intPrimLName = libFun FSLIT("intPrimL") intPrimLIdKey
1453 floatPrimLName = libFun FSLIT("floatPrimL") floatPrimLIdKey
1454 doublePrimLName = libFun FSLIT("doublePrimL") doublePrimLIdKey
1455 rationalLName = libFun FSLIT("rationalL") rationalLIdKey
1458 litPName = libFun FSLIT("litP") litPIdKey
1459 varPName = libFun FSLIT("varP") varPIdKey
1460 tupPName = libFun FSLIT("tupP") tupPIdKey
1461 conPName = libFun FSLIT("conP") conPIdKey
1462 infixPName = libFun FSLIT("infixP") infixPIdKey
1463 tildePName = libFun FSLIT("tildeP") tildePIdKey
1464 asPName = libFun FSLIT("asP") asPIdKey
1465 wildPName = libFun FSLIT("wildP") wildPIdKey
1466 recPName = libFun FSLIT("recP") recPIdKey
1467 listPName = libFun FSLIT("listP") listPIdKey
1468 sigPName = libFun FSLIT("sigP") sigPIdKey
1470 -- type FieldPat = ...
1471 fieldPatName = libFun FSLIT("fieldPat") fieldPatIdKey
1474 matchName = libFun FSLIT("match") matchIdKey
1476 -- data Clause = ...
1477 clauseName = libFun FSLIT("clause") clauseIdKey
1480 varEName = libFun FSLIT("varE") varEIdKey
1481 conEName = libFun FSLIT("conE") conEIdKey
1482 litEName = libFun FSLIT("litE") litEIdKey
1483 appEName = libFun FSLIT("appE") appEIdKey
1484 infixEName = libFun FSLIT("infixE") infixEIdKey
1485 infixAppName = libFun FSLIT("infixApp") infixAppIdKey
1486 sectionLName = libFun FSLIT("sectionL") sectionLIdKey
1487 sectionRName = libFun FSLIT("sectionR") sectionRIdKey
1488 lamEName = libFun FSLIT("lamE") lamEIdKey
1489 tupEName = libFun FSLIT("tupE") tupEIdKey
1490 condEName = libFun FSLIT("condE") condEIdKey
1491 letEName = libFun FSLIT("letE") letEIdKey
1492 caseEName = libFun FSLIT("caseE") caseEIdKey
1493 doEName = libFun FSLIT("doE") doEIdKey
1494 compEName = libFun FSLIT("compE") compEIdKey
1495 -- ArithSeq skips a level
1496 fromEName = libFun FSLIT("fromE") fromEIdKey
1497 fromThenEName = libFun FSLIT("fromThenE") fromThenEIdKey
1498 fromToEName = libFun FSLIT("fromToE") fromToEIdKey
1499 fromThenToEName = libFun FSLIT("fromThenToE") fromThenToEIdKey
1501 listEName = libFun FSLIT("listE") listEIdKey
1502 sigEName = libFun FSLIT("sigE") sigEIdKey
1503 recConEName = libFun FSLIT("recConE") recConEIdKey
1504 recUpdEName = libFun FSLIT("recUpdE") recUpdEIdKey
1506 -- type FieldExp = ...
1507 fieldExpName = libFun FSLIT("fieldExp") fieldExpIdKey
1510 guardedBName = libFun FSLIT("guardedB") guardedBIdKey
1511 normalBName = libFun FSLIT("normalB") normalBIdKey
1514 normalGEName = libFun FSLIT("normalGE") normalGEIdKey
1515 patGEName = libFun FSLIT("patGE") patGEIdKey
1518 bindSName = libFun FSLIT("bindS") bindSIdKey
1519 letSName = libFun FSLIT("letS") letSIdKey
1520 noBindSName = libFun FSLIT("noBindS") noBindSIdKey
1521 parSName = libFun FSLIT("parS") parSIdKey
1524 funDName = libFun FSLIT("funD") funDIdKey
1525 valDName = libFun FSLIT("valD") valDIdKey
1526 dataDName = libFun FSLIT("dataD") dataDIdKey
1527 newtypeDName = libFun FSLIT("newtypeD") newtypeDIdKey
1528 tySynDName = libFun FSLIT("tySynD") tySynDIdKey
1529 classDName = libFun FSLIT("classD") classDIdKey
1530 instanceDName = libFun FSLIT("instanceD") instanceDIdKey
1531 sigDName = libFun FSLIT("sigD") sigDIdKey
1532 forImpDName = libFun FSLIT("forImpD") forImpDIdKey
1535 cxtName = libFun FSLIT("cxt") cxtIdKey
1537 -- data Strict = ...
1538 isStrictName = libFun FSLIT("isStrict") isStrictKey
1539 notStrictName = libFun FSLIT("notStrict") notStrictKey
1542 normalCName = libFun FSLIT("normalC") normalCIdKey
1543 recCName = libFun FSLIT("recC") recCIdKey
1544 infixCName = libFun FSLIT("infixC") infixCIdKey
1545 forallCName = libFun FSLIT("forallC") forallCIdKey
1547 -- type StrictType = ...
1548 strictTypeName = libFun FSLIT("strictType") strictTKey
1550 -- type VarStrictType = ...
1551 varStrictTypeName = libFun FSLIT("varStrictType") varStrictTKey
1554 forallTName = libFun FSLIT("forallT") forallTIdKey
1555 varTName = libFun FSLIT("varT") varTIdKey
1556 conTName = libFun FSLIT("conT") conTIdKey
1557 tupleTName = libFun FSLIT("tupleT") tupleTIdKey
1558 arrowTName = libFun FSLIT("arrowT") arrowTIdKey
1559 listTName = libFun FSLIT("listT") listTIdKey
1560 appTName = libFun FSLIT("appT") appTIdKey
1562 -- data Callconv = ...
1563 cCallName = libFun FSLIT("cCall") cCallIdKey
1564 stdCallName = libFun FSLIT("stdCall") stdCallIdKey
1566 -- data Safety = ...
1567 unsafeName = libFun FSLIT("unsafe") unsafeIdKey
1568 safeName = libFun FSLIT("safe") safeIdKey
1569 threadsafeName = libFun FSLIT("threadsafe") threadsafeIdKey
1571 -- data FunDep = ...
1572 funDepName = libFun FSLIT("funDep") funDepIdKey
1574 matchQTyConName = libTc FSLIT("MatchQ") matchQTyConKey
1575 clauseQTyConName = libTc FSLIT("ClauseQ") clauseQTyConKey
1576 expQTyConName = libTc FSLIT("ExpQ") expQTyConKey
1577 stmtQTyConName = libTc FSLIT("StmtQ") stmtQTyConKey
1578 decQTyConName = libTc FSLIT("DecQ") decQTyConKey
1579 conQTyConName = libTc FSLIT("ConQ") conQTyConKey
1580 strictTypeQTyConName = libTc FSLIT("StrictTypeQ") strictTypeQTyConKey
1581 varStrictTypeQTyConName = libTc FSLIT("VarStrictTypeQ") varStrictTypeQTyConKey
1582 typeQTyConName = libTc FSLIT("TypeQ") typeQTyConKey
1583 fieldExpQTyConName = libTc FSLIT("FieldExpQ") fieldExpQTyConKey
1584 patQTyConName = libTc FSLIT("PatQ") patQTyConKey
1585 fieldPatQTyConName = libTc FSLIT("FieldPatQ") fieldPatQTyConKey
1587 -- TyConUniques available: 100-129
1588 -- Check in PrelNames if you want to change this
1590 expTyConKey = mkPreludeTyConUnique 100
1591 matchTyConKey = mkPreludeTyConUnique 101
1592 clauseTyConKey = mkPreludeTyConUnique 102
1593 qTyConKey = mkPreludeTyConUnique 103
1594 expQTyConKey = mkPreludeTyConUnique 104
1595 decQTyConKey = mkPreludeTyConUnique 105
1596 patTyConKey = mkPreludeTyConUnique 106
1597 matchQTyConKey = mkPreludeTyConUnique 107
1598 clauseQTyConKey = mkPreludeTyConUnique 108
1599 stmtQTyConKey = mkPreludeTyConUnique 109
1600 conQTyConKey = mkPreludeTyConUnique 110
1601 typeQTyConKey = mkPreludeTyConUnique 111
1602 typeTyConKey = mkPreludeTyConUnique 112
1603 decTyConKey = mkPreludeTyConUnique 113
1604 varStrictTypeQTyConKey = mkPreludeTyConUnique 114
1605 strictTypeQTyConKey = mkPreludeTyConUnique 115
1606 fieldExpTyConKey = mkPreludeTyConUnique 116
1607 fieldPatTyConKey = mkPreludeTyConUnique 117
1608 nameTyConKey = mkPreludeTyConUnique 118
1609 patQTyConKey = mkPreludeTyConUnique 119
1610 fieldPatQTyConKey = mkPreludeTyConUnique 120
1611 fieldExpQTyConKey = mkPreludeTyConUnique 121
1612 funDepTyConKey = mkPreludeTyConUnique 122
1614 -- IdUniques available: 200-399
1615 -- If you want to change this, make sure you check in PrelNames
1617 returnQIdKey = mkPreludeMiscIdUnique 200
1618 bindQIdKey = mkPreludeMiscIdUnique 201
1619 sequenceQIdKey = mkPreludeMiscIdUnique 202
1620 liftIdKey = mkPreludeMiscIdUnique 203
1621 newNameIdKey = mkPreludeMiscIdUnique 204
1622 mkNameIdKey = mkPreludeMiscIdUnique 205
1623 mkNameG_vIdKey = mkPreludeMiscIdUnique 206
1624 mkNameG_dIdKey = mkPreludeMiscIdUnique 207
1625 mkNameG_tcIdKey = mkPreludeMiscIdUnique 208
1626 mkNameLIdKey = mkPreludeMiscIdUnique 209
1630 charLIdKey = mkPreludeMiscIdUnique 210
1631 stringLIdKey = mkPreludeMiscIdUnique 211
1632 integerLIdKey = mkPreludeMiscIdUnique 212
1633 intPrimLIdKey = mkPreludeMiscIdUnique 213
1634 floatPrimLIdKey = mkPreludeMiscIdUnique 214
1635 doublePrimLIdKey = mkPreludeMiscIdUnique 215
1636 rationalLIdKey = mkPreludeMiscIdUnique 216
1639 litPIdKey = mkPreludeMiscIdUnique 220
1640 varPIdKey = mkPreludeMiscIdUnique 221
1641 tupPIdKey = mkPreludeMiscIdUnique 222
1642 conPIdKey = mkPreludeMiscIdUnique 223
1643 infixPIdKey = mkPreludeMiscIdUnique 312
1644 tildePIdKey = mkPreludeMiscIdUnique 224
1645 asPIdKey = mkPreludeMiscIdUnique 225
1646 wildPIdKey = mkPreludeMiscIdUnique 226
1647 recPIdKey = mkPreludeMiscIdUnique 227
1648 listPIdKey = mkPreludeMiscIdUnique 228
1649 sigPIdKey = mkPreludeMiscIdUnique 229
1651 -- type FieldPat = ...
1652 fieldPatIdKey = mkPreludeMiscIdUnique 230
1655 matchIdKey = mkPreludeMiscIdUnique 231
1657 -- data Clause = ...
1658 clauseIdKey = mkPreludeMiscIdUnique 232
1661 varEIdKey = mkPreludeMiscIdUnique 240
1662 conEIdKey = mkPreludeMiscIdUnique 241
1663 litEIdKey = mkPreludeMiscIdUnique 242
1664 appEIdKey = mkPreludeMiscIdUnique 243
1665 infixEIdKey = mkPreludeMiscIdUnique 244
1666 infixAppIdKey = mkPreludeMiscIdUnique 245
1667 sectionLIdKey = mkPreludeMiscIdUnique 246
1668 sectionRIdKey = mkPreludeMiscIdUnique 247
1669 lamEIdKey = mkPreludeMiscIdUnique 248
1670 tupEIdKey = mkPreludeMiscIdUnique 249
1671 condEIdKey = mkPreludeMiscIdUnique 250
1672 letEIdKey = mkPreludeMiscIdUnique 251
1673 caseEIdKey = mkPreludeMiscIdUnique 252
1674 doEIdKey = mkPreludeMiscIdUnique 253
1675 compEIdKey = mkPreludeMiscIdUnique 254
1676 fromEIdKey = mkPreludeMiscIdUnique 255
1677 fromThenEIdKey = mkPreludeMiscIdUnique 256
1678 fromToEIdKey = mkPreludeMiscIdUnique 257
1679 fromThenToEIdKey = mkPreludeMiscIdUnique 258
1680 listEIdKey = mkPreludeMiscIdUnique 259
1681 sigEIdKey = mkPreludeMiscIdUnique 260
1682 recConEIdKey = mkPreludeMiscIdUnique 261
1683 recUpdEIdKey = mkPreludeMiscIdUnique 262
1685 -- type FieldExp = ...
1686 fieldExpIdKey = mkPreludeMiscIdUnique 265
1689 guardedBIdKey = mkPreludeMiscIdUnique 266
1690 normalBIdKey = mkPreludeMiscIdUnique 267
1693 normalGEIdKey = mkPreludeMiscIdUnique 310
1694 patGEIdKey = mkPreludeMiscIdUnique 311
1697 bindSIdKey = mkPreludeMiscIdUnique 268
1698 letSIdKey = mkPreludeMiscIdUnique 269
1699 noBindSIdKey = mkPreludeMiscIdUnique 270
1700 parSIdKey = mkPreludeMiscIdUnique 271
1703 funDIdKey = mkPreludeMiscIdUnique 272
1704 valDIdKey = mkPreludeMiscIdUnique 273
1705 dataDIdKey = mkPreludeMiscIdUnique 274
1706 newtypeDIdKey = mkPreludeMiscIdUnique 275
1707 tySynDIdKey = mkPreludeMiscIdUnique 276
1708 classDIdKey = mkPreludeMiscIdUnique 277
1709 instanceDIdKey = mkPreludeMiscIdUnique 278
1710 sigDIdKey = mkPreludeMiscIdUnique 279
1711 forImpDIdKey = mkPreludeMiscIdUnique 297
1714 cxtIdKey = mkPreludeMiscIdUnique 280
1716 -- data Strict = ...
1717 isStrictKey = mkPreludeMiscIdUnique 281
1718 notStrictKey = mkPreludeMiscIdUnique 282
1721 normalCIdKey = mkPreludeMiscIdUnique 283
1722 recCIdKey = mkPreludeMiscIdUnique 284
1723 infixCIdKey = mkPreludeMiscIdUnique 285
1724 forallCIdKey = mkPreludeMiscIdUnique 288
1726 -- type StrictType = ...
1727 strictTKey = mkPreludeMiscIdUnique 286
1729 -- type VarStrictType = ...
1730 varStrictTKey = mkPreludeMiscIdUnique 287
1733 forallTIdKey = mkPreludeMiscIdUnique 290
1734 varTIdKey = mkPreludeMiscIdUnique 291
1735 conTIdKey = mkPreludeMiscIdUnique 292
1736 tupleTIdKey = mkPreludeMiscIdUnique 294
1737 arrowTIdKey = mkPreludeMiscIdUnique 295
1738 listTIdKey = mkPreludeMiscIdUnique 296
1739 appTIdKey = mkPreludeMiscIdUnique 293
1741 -- data Callconv = ...
1742 cCallIdKey = mkPreludeMiscIdUnique 300
1743 stdCallIdKey = mkPreludeMiscIdUnique 301
1745 -- data Safety = ...
1746 unsafeIdKey = mkPreludeMiscIdUnique 305
1747 safeIdKey = mkPreludeMiscIdUnique 306
1748 threadsafeIdKey = mkPreludeMiscIdUnique 307
1750 -- data FunDep = ...
1751 funDepIdKey = mkPreludeMiscIdUnique 320