On 1/5/08, Neil Mitchell <[EMAIL PROTECTED]> wrote: > Hi > > I've compiled the Debug.Trace module to Core, but can't understand the > resulting output. The original code is: > > trace string expr = unsafePerformIO $ do > putTraceMsg string > return expr > > The core is: > > Debug.Trace.trace = > \ (@ a) -> > __letrec { > trace :: GHC.Base.String -> a -> a > [] > trace = > \ (string :: GHC.Base.String) (expr :: a) -> > GHC.Base.$ > @ (GHC.IOBase.IO a) > @ a > (GHC.IOBase.unsafePerformIO @ a) > (>> @ () @ a (Debug.Trace.putTraceMsg string) (return @ a expr)); > $dMonad :: GHC.Base.Monad GHC.IOBase.IO > [] > $dMonad = $dMonad; > return :: forall a. a -> GHC.IOBase.IO a > [] > return = GHC.Base.return @ GHC.IOBase.IO $dMonad; > $dMonad :: GHC.Base.Monad GHC.IOBase.IO > [] > $dMonad = GHC.IOBase.$f16; > >> :: forall a b. > GHC.IOBase.IO a -> GHC.IOBase.IO b -> GHC.IOBase.IO b > [] > >> = GHC.Base.>> @ GHC.IOBase.IO $dMonad; > } in trace; > > And my Haskell reformatting of that is: > > Debug.Trace.trace = let > trace string expr = unsafePerformIO $ putTraceMsg string >> return expr > $dMonad = $dMonad; > return = GHC.Base.return $dMonad; > $dMonad = GHC.IOBase.$f16; > >> = GHC.Base.>> $dMonad; > in trace > > However, that let expression has two bindings for $dMonad, one of > which looks like a black-hole. Are the semantics of __letrec different > from let in some way? >
How are you printing out the Core? It looks like the unique ids are missing (you can see them if you pass the -ppr-debug flag, which can be set using the API) -- if the unique ids were being printed, you would see that the bindings for $dMonad (likely) have different uniques. Cheers, Tim -- Tim Chevalier * http://cs.pdx.edu/~tjc * Often in error, never in doubt "...Losing your mind, like losing your car keys, is a real hassle." -- Andrew Solomon _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users