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