On 20/02/2005, at 1:49 AM, Keean Schupke wrote:
Ahh, I am doing a form of source to source translation for Haskell. I don't want to maintain the parser for this so TH seemed to be ideal.
I would be happy with the restriction of no splices within the meta-quotes.
If TH is already type checking (it is, as it will catch type errors in the meta-quoted code) then surely this type info is available, it just needs to be reified?
Check out this code from fptools/ghc/compiler/typecheck/TcSplice.lhs The comment mid-way is quite interesting. tcBracket :: HsBracket Name -> Expected TcType -> TcM (LHsExpr Id) tcBracket brack res_ty = getStage `thenM` \ level -> case bracketOK level of { Nothing -> failWithTc (illegalBracket level) ; Just next_level -> -- Typecheck expr to make sure it is valid, -- but throw away the results. We'll type check -- it again when we actually use it. recordThUse `thenM_` newMutVar [] `thenM` \ pending_splices -> getLIEVar `thenM` \ lie_var -> setStage (Brack next_level pending_splices lie_var) ( getLIE (tc_bracket brack) ) `thenM` \ (meta_ty, lie) -> tcSimplifyBracket lie `thenM_` -- Make the expected type have the right shape zapExpectedTo res_ty meta_ty `thenM_` -- Return the original expression, not the type-decorated one readMutVar pending_splices `thenM` \ pendings -> returnM (noLoc (HsBracketOut brack pendings)) } I found that reifying from another module was almost what I wanted but I wanted to be able to get type information for *all* variables at the very least, and preferably everything. But I remember that I couldn't. I think it might have been the case that you can only get the type of things actually present in .hi files, which I think means just top level functions. Anyone else know about this?
Who maintains that part of the TH code in GHC?
Ian Lynagh would probably have some familiarity with it. As for maintaining it - it's probably Simon Peyton Jones. Cheers, Sean