parsing types

Simon Peyton-Jones simonpj at microsoft.com
Tue Apr 26 12:13:51 CEST 2011


Ranjit

[NB: all of this is based on a quick look at the source code; I'm not that familiar with the GHC API, so others may correct me.]

A good entry point to the GHC API is InteractiveEval.hs.  You'll see that all its functions are parameterised over a simple state monad (GhcMonad m), which is any monad supporting 
  getSession :: m HscEnv
  setSession :: HscEnv -> m ()

The HscEnv encapsulates all the persistent state of the session, including the "ambient modules"; in a GHCi session these are the ones you have "imported" to the command line prompt.

You can augment these ambient modules with InteractiveEval.setContext.  (Its API is a bit confusing and it's on my list of things to change.)  So just call that to augment the context.

Then you can call hscTcExpr. [Maybe there should be a GhcMonad version of this function, with the type sig you give.  The one in HscMain isn't.]

Does that help?

Simon

| -----Original Message-----
| From: glasgow-haskell-users-bounces at haskell.org [mailto:glasgow-haskell-
| users-bounces at haskell.org] On Behalf Of Ranjit Jhala
| Sent: 24 April 2011 02:27
| To: Daniel Peebles
| Cc: ghc-users
| Subject: Re: parsing types
| 
| Hi Daniel --
| 
| that was a good lead, with a little digging around, I found
| 
| 	hscTcExpr :: GhcMonad m => HscEnv -> String -> m Type
| 
| which almost gets the job done, if only I could call it with
| the appropriate HscEnv. The one I get using
| 
| 	getSession :: GhcMonad m => m HscEnv
| 
| appears rather impoverished, as it fails to find the usual
| prelude names like
| 
| 	Not in scope: `undefined'
| 	Not in scope: `error'
| 
| (though it does succeed on the expression "5" yielding the type)
| 
| "forall t_a4eW. (GHC.Num.Num t_a4eW) => t_a4eW"
| 
| Does anyone have a clue as to how to get a hold on an appropriate
| environment? (I would have thought that the HscEnv obtained _after_
| compiling some file "f" would populated with at least the names
| needed to compile "f") that is, if I do:
| 
|       	cm0  <- compileToCoreSimplified f
| 	env  <- getSession
| 
| then the resulting "env" would suffice, but unfortunately thats not
| the case...
| 
| Thanks!,
| 
| Ranjit.
| 
| 
| 
| 
| 
| 
| 
| 
| On Apr 23, 2011, at 11:54 AM, Daniel Peebles wrote:
| 
| > I don't have an answer for you, but you might want to look at what :k does
| in ghci, since that needs to parse a type.
| >
| > On Sat, Apr 23, 2011 at 2:06 PM, Ranjit Jhala <jhala at cs.ucsd.edu> wrote:
| > Hi all,
| >
| > can someone give me a hint as to the best way to parse a type from a
| string.
| > Ideally, I'd like a function
| >
| >        stringType :: String -> Maybe Type
| >
| > or possibly,
| >
| >        stringType :: (GhcMonad m) => String -> m (Maybe Type)
| >
| > such that,
| >
| >        stringType s == Just t
| >
| > if in the current GHC context the string s is the name of the type t. For
| > example, I'd like:
| >
| >        stringType "Int"
| >
| > to return a value equal to intTy (from TysWiredIn). My investigations have
| > led me to
| >
| >        parseType :: P (LHsType RdrName)
| >
| > and I suspect that with some work (mainly creating an appropriate PState,
| > and mapping the name back, I can extract what I want, but I was wondering
| > if there is some simpler route that I've overlooked.
| >
| > Thanks!
| >
| > Ranjit.
| >
| > _______________________________________________
| > Glasgow-haskell-users mailing list
| > Glasgow-haskell-users at haskell.org
| > http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
| >
| 
| 
| _______________________________________________
| Glasgow-haskell-users mailing list
| Glasgow-haskell-users at haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-users




More information about the Glasgow-haskell-users mailing list