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 > > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe