On Wed, 2004-03-24 at 15:51, Simon Marlow wrote: > > > I am new to haskell and would look to write a function equivalent > > > to the following loop in C > > > > > > int value = 500000; > > > int part_stack[4]; > > > int *part_ptr = part_stack; > > > for (; value; value /= 10000) > > > *part_ptr++ = value % 10000; > > > > part_stack :: [Int] > > part_stack = [0,50] > > > > Note that I've performed a memoization optimization--this > > makes the code both smaller, faster and easier to read! :P > > Ignore David, he's pulling your leg. Here's the proper translation: > > do > alloca $ \value -> do > poke value (500000::Int) > allocaArray 4 $ \part_stack -> do > alloca $ \part_ptr -> do > poke part_ptr part_stack > let loop = do > val <- peek value > if val == 0 then return () else do > p <- peek part_ptr > poke p (val `rem` 10000) > poke part_ptr (p `plusPtr` 1) > poke value (val `quot` 10000) > loop > loop
Yes, very nice. Poor Simon, he's clearly been writing too much low-level FFI code recently. :-) Duncan _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe