はじめてのHaskell
全然Haskellやってないのだった。
a-zのアルファベット26文字を表示するプログラム
import Foreign.Marshal.Alloc import Foreign.Marshal.Pool import Foreign.Storable import Foreign.C.String import Foreign.Storable main = withPool $ \p-> do { a <- pooledMallocBytes p 27 ; mapM (\n -> pokeElemOff a n ((castCharToCChar 'a') + (fromIntegral n))) [0..25] ; s <- peekCString a ; putStrLn s }
ふむ…
import Foreign.Marshal.Alloc import Foreign.C.String import Foreign.C.Types import Foreign.Storable import Foreign.Ptr foreign import ccall unsafe "puts" _puts :: Ptr CChar -> IO () main = allocaBytes 32 $ set where set :: Ptr CChar -> IO() set p = do { pokeElemOff p 0 65 ; pokeElemOff p 1 66 ; pokeElemOff p 2 67 ; pokeElemOff p 3 68 ; pokeElemOff p 4 0 ; _puts p }
こういうコードをコンパイルすると、
*((StgWord8*)(_s1DE)) = (StgWord8)(0x41U); *((StgWord8*)(_s1DE+1)) = (StgWord8)(0x42U); *((StgWord8*)(_s1DE+2)) = (StgWord8)(0x43U); *((StgWord8*)(_s1DE+3)) = (StgWord8)(0x44U); *((StgWord8*)(_s1DE+4)) = (StgWord8)(0x0); CALLER_SAVE_SYSTEM puts((void *)_s1DE); CALLER_RESTORE_SYSTEM
こんな感じのコードになるのを見ると、Haskellってうまく書けば、なんかそんな感じにうまくいくのかなー、とか思う。