On Wed, Oct 01, 2003 at 05:34:47PM +0100, Alastair Reid wrote: > > > Yes, I've run into this before. In fact this is one of those tricky > > problems where you can't quite get tail-recursion where you want it: > > (pseudo-ish code follows) > > > > peekCString ptr = do > > x <- peek ptr > > if x == '\0' then return [] else do > > xs <- peekCString (ptr + 1) > > return (x:xs) > > > > Any ideas? I seem to recall the ML folks have a hack for dealing with > > this. > > Off the top of my head: > > 1) Compute length of C string. > (As usual, need to use seq on the '+1' argument.) > 2) Scan from right to left, constructing the list.
This scan is what peekArray does now. We just need peekArray0 :: (Storable a, Eq a) => a -> Ptr a -> IO [a] peekArray0 marker ptr = do size <- lengthArray0 marker ptr peekArray size ptr and similarly for CStrings. _______________________________________________ Glasgow-haskell-bugs mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs