Inspecting function arguments in GHCi

Andrew Kvapil viluon at
Mon Jan 25 11:05:46 UTC 2021


I'm interested in inspecting the strictness of functions at runtime
and the depth of thunks "in the wild." For this reason I'm modifying
GHC 8.10.2, essentially to add additional information to breakpoints.
I'd like to reuse the logic behind GHCi's :print command
(pprintClosureCommand, obtainTermFromId, ...) for which I suppose I
need Id's. Those however don't exist for destructuring patterns, such
as those in the following equations:

     last [x] = x
     last (_:xs) = last xs

So I'm wondering where would be a good place in the pipeline to
transform patterns like these into at-patterns, to give them Id's.
However, the breakpoint logic only looks at the free variables of the
right-hand sides and not transitively, which means that e.g. in the
following example neither ':print arg1' nor ':print as' works when the
interpreter hits a breakpoint in the top level expression on the RHS:

     qsort arg1@(a:as) = qsort left ++ [a] ++ qsort right
       where (left, right) = (filter (<=a) as, filter (>a) as)

Thus I'd also like to know how to extend the free var logic for
Tickish that eventually leads to CgBreakInfo and :print's ability to
inspect these bindings at runtime. My goal would be to determine to what
extent was a thunk evaluated during function application.

Any advice would be greatly appreciated!

Andrew Kvapil

More information about the ghc-devs mailing list