
you are right, that pice of code is ugly. i would write sth simmilar (Int32->[Word8]) like you did, iff it should be able to cross-compile or do not need to be fast or should not need TH. well, i think, in the case of joel's project the last sentence means "..., iff true or true or undefined". is there any architecture with sth like 0xaabbccdd->bb aa dd cc, ghc (or any other haskell-compiler) runs on? (i did know, that such architectures exist.) - marc Udo Stenzel wrote:
Why don't you pull out 4 bytes and assemble them manually?
To that I'd like to add a snippet from NewBinary itself:
| instance Binary Word32 where | put_ h w = do | putByte h (fromIntegral (w `shiftR` 24)) | putByte h (fromIntegral ((w `shiftR` 16) .&. 0xff)) | putByte h (fromIntegral ((w `shiftR` 8) .&. 0xff)) | putByte h (fromIntegral (w .&. 0xff)) | get h = do | w1 <- getWord8 h | w2 <- getWord8 h | w3 <- getWord8 h | w4 <- getWord8 h | return $! ((fromIntegral w1 `shiftL` 24) .|. | (fromIntegral w2 `shiftL` 16) .|. | (fromIntegral w3 `shiftL` 8) .|. | (fromIntegral w4))
This obviously writes a Word32 in big endian format, also known as "network byte order", and doesn't care how the host platform stores integers. No need for `hton' and `ntoh'. To convert it to write little endian, just copy it and reorder some lines. (But I think, writing LE integers with no good reason and without an enclosing protocol that explicitly declares them (like IIOP) is a bad idea.)
[Which reminds me, has anyone ever tried implementing a Corba ORB in Haskell? There's a binding to MICO, but that just adds to the uglyness of MICO and does Haskell a bit of injustice...]
Well, I liked that bit of Template Haskell code that Marc sent. I'm now stuck trying to adapt it to read Storables :-).
I don't. It's complex machinery, it's ugly, it solves a problem that doesn't even exist and it solves it incompletely. It will determine the byte order of the host system, not of the target, which fails when cross-compiling, and it doesn't work on machines with little endian words and big endian long words (yes, this has been seen in the wild, though might be extinct these days). Use it only if You Know What You Are Doing, have a performance problem and also know that writing integers en bloc would help with it.
I could read a FastString from a socket since it has IO methods but I don't know how to convert the FS into a pointer suitable for Storable. So much to learn :-).
useAsCString might be your friend. But so might be (fold (:) []).
Udo. -- "The greatest dangers to liberty lurk in insidious encroachment by men of zeal, well-meaning but without understanding." -- Brandeis
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe