On Sep 27, 2007, at 9:14 AM, Pepe Iborra wrote:
Actually, in 6.8 we can build isWHNF on top of the GHC-API.
First, you need to import the ghc package:
ghci -package ghc
GHCi, version 6.7: http://www.haskell.org/ghc/ :? for help
Then, you can define the isWHNF function as follows:
Prelude> :m +RtClosureInspect
Prelude RtClosureInspect> let isWHNF = fmap (isConstr . tipe) .
getClosureData
Prelude RtClosureInspect> :t isWHNF
isWHNF :: a -> IO Bool
What the code above does is to inspect the info table associated to
the value given, and check if the closure is a Constructor closure,
i.e. in WHNF.
Very cool. This is much nicer than when I asked much the same
question a few years back (and I can think of all sorts of
interesting things I can learn from the interface in that module).
But what about indirection chasing? Surely we want isWHNF to return
True if we have an indirection to a WHNF. Possibly one wants
something a bit like this (untested, and rather depends on GHC's
indirection semantics):
removingIndirections :: (forall c . c -> IO b) -> a -> IO b
removingIndirections k a = do
closureData <- getClosureData a
if isConstr (tipe closureData) then
removingIndirections (ptrs closureData ! 0)
else
k a
simpleIsWHNF :: a -> IO Boolean
simpleIsWHNF = fmap (isConstr . tipe) . getClosureData
isWHNF = removingIndirections simpleIsWHNF
-Jan-Willem Maessen
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe