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