+\subsection{Getting information about an identifer}
+%* *
+%************************************************************************
+
+\begin{code}
+#ifdef GHCI
+hscThing -- like hscStmt, but deals with a single identifier
+ :: HscEnv
+ -> PersistentCompilerState -- IN: persistent compiler state
+ -> InteractiveContext -- Context for compiling
+ -> String -- The identifier
+ -> IO ( PersistentCompilerState,
+ [TyThing] )
+
+hscThing hsc_env pcs0 ic str
+ = do let dflags = hsc_dflags hsc_env
+
+ maybe_rdr_name <- myParseIdentifier dflags str
+ case maybe_rdr_name of {
+ Nothing -> return (pcs0, []);
+ Just rdr_name -> do
+
+ (pcs1, maybe_tc_result) <-
+ tcRnThing hsc_env pcs0 ic rdr_name
+
+ case maybe_tc_result of {
+ Nothing -> return (pcs1, []) ;
+ Just things -> return (pcs1, things)
+ }}
+
+myParseIdentifier dflags str
+ = do buf <- stringToStringBuffer str
+
+ let exts = ExtFlags {glasgowExtsEF = dopt Opt_GlasgowExts dflags,
+ ffiEF = dopt Opt_FFI dflags,
+ withEF = dopt Opt_With dflags,
+ parrEF = dopt Opt_PArr dflags}
+ loc = mkSrcLoc FSLIT("<interactive>") 1
+
+ case parseIdentifier buf (mkPState loc exts) of
+
+ PFailed err -> do { hPutStrLn stderr (showSDoc err);
+ freeStringBuffer buf;
+ return Nothing }
+
+ POk _ rdr_name -> do { --should, but can't: freeStringBuffer buf;
+ return (Just rdr_name) }
+#endif
+\end{code}
+
+%************************************************************************
+%* *
+ Desugar, simplify, convert to bytecode, and link an expression
+%* *
+%************************************************************************
+
+\begin{code}
+#ifdef GHCI
+compileExpr :: HscEnv
+ -> PersistentCompilerState
+ -> Module -> PrintUnqualified
+ -> TypecheckedHsExpr
+ -> IO HValue
+
+compileExpr hsc_env pcs this_mod print_unqual tc_expr
+ = do { let dflags = hsc_dflags hsc_env
+
+ -- Desugar it
+ ; ds_expr <- deSugarExpr hsc_env pcs this_mod print_unqual tc_expr
+
+ -- Flatten it
+ ; flat_expr <- flattenExpr hsc_env pcs ds_expr
+
+ -- Simplify it
+ ; simpl_expr <- simplifyExpr dflags flat_expr
+
+ -- Tidy it (temporary, until coreSat does cloning)
+ ; tidy_expr <- tidyCoreExpr simpl_expr
+
+ -- Prepare for codegen
+ ; prepd_expr <- corePrepExpr dflags tidy_expr
+
+ -- Convert to BCOs
+ ; bcos <- coreExprToBCOs dflags prepd_expr
+
+ -- link it
+ ; hval <- linkExpr hsc_env pcs bcos
+
+ ; return hval
+ }
+#endif
+\end{code}
+
+
+%************************************************************************
+%* *