On 23 November 2005 18:29, Sigbjorn Finne wrote:

> The appended snippet might help..
> 
> --sigbjorn
> 
> -- whnf.hs
> import Foreign.StablePtr
> import System.IO.Unsafe
> 
> isWHNF :: a -> Bool
> isWHNF a = unsafePerformIO $ do
>    stl <- newStablePtr a
>    rc  <- isWhnf stl
>    freeStablePtr stl
>    return (rc /= 0)
> 
> foreign import ccall safe "isWhnf" isWhnf :: StablePtr a -> IO Int
> 
> /* whnf.c */
> #include "Rts.h"
> int
> isWhnf(StgStablePtr st)
> {
>     StgClosure* c = (StgClosure*)(stable_ptr_table[(StgWord)st].addr);
>     return !(closure_THUNK(c));
> }

using deRefStablePtr() would be slightly better.  Also, you should
consider whether you want indirections to be counted as WHNF or not.

Also, I think you can make that foreign import "unsafe" (safe will be
slow).  For more speed you could implement it directly as a primitive.

Cheers,
        Simon
_______________________________________________
Glasgow-haskell-users mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to