2013年12月22日日曜日

開発環境

C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅢ部(高度なプログラミング概念)の18章(モジュールプログラミング)、18-14(プログラミング実習)、実習18-1.をHaskellで解いてみる。

その他参考書籍

18-14(プログラミング実習)、実習18-1.

コード(BBEdit)

Sample.hs

{-# OPTIONS -Wall -Werror #-}
import qualified Temp as T
import qualified System.IO as IO
import System.Environment

main :: IO ()
main = do
    (a:b:_) <- getArgs
    inHandle <- IO.openFile a IO.ReadMode
    outHandle <- T.openFile b
    T.defineHeader outHandle "OUTPUT FILE"
    contents <- IO.hGetContents inHandle
    let ls = lines contents
    f 2 outHandle ls
    IO.hClose inHandle
    

f :: Int -> IO.Handle -> [String] -> IO ()
f _ handle [] = T.closeFile handle
f n handle (x:xs) =
    if n == 11 then do
        T.page handle
        f 1 handle xs
    else do
        T.printLine handle x
        f (n + 1) handle xs

コード(BBEdit)

Temp.hs

{-# OPTIONS -Wall -Werror *-}
module Temp ( openFile,
              defineHeader,
              printLine,
              page,
              closeFile) where

import qualified System.IO as IO

openFile :: String -> IO IO.Handle
openFile s = IO.openFile s IO.WriteMode

defineHeader :: IO.Handle -> String -> IO ()
defineHeader handle heading = IO.hPutStrLn handle ("HEADER: " ++ heading)

printLine :: IO.Handle -> String -> IO ()
printLine = IO.hPutStrLn

page :: IO.Handle -> IO ()
page handle = IO.hPutChar handle '\f'

closeFile :: IO.Handle -> IO ()
closeFile = IO.hClose

入出力結果(Terminal, runghc)

$ ghc --make Sample.hs
[1 of 2] Compiling Temp             ( Temp.hs, Temp.o )
[2 of 2] Compiling Main             ( Sample.hs, Sample.o )
Linking Sample ...
$ ./Sample Sample.hs Sample.hs.txt
$ ./Sample Temp.hs Temp.hs.txt
$ cat -nv Sample.hs.txt Temp.hs.txt
     1 HEADER: OUTPUT FILE
     2 {-# OPTIONS -Wall -Werror #-}
     3 import qualified Temp as T
     4 import qualified System.IO as IO
     5 import System.Environment
     6 
     7 main :: IO ()
     8 main = do
     9     (a:b:_) <- getArgs
    10     inHandle <- IO.openFile a IO.ReadMode
    11 ^L    T.defineHeader outHandle "OUTPUT FILE"
    12     contents <- IO.hGetContents inHandle
    13     let ls = lines contents
    14     f 2 outHandle ls
    15     IO.hClose inHandle
    16     
    17 
    18 f :: Int -> IO.Handle -> [String] -> IO ()
    19 f _ handle [] = T.closeFile handle
    20 f n handle (x:xs) =
    21 ^L        T.page handle
    22         f 1 handle xs
    23     else do
    24         T.printLine handle x
    25         f (n + 1) handle xs
     1 HEADER: OUTPUT FILE
     2 {-# OPTIONS -Wall -Werror *-}
     3 module Temp ( openFile,
     4               defineHeader,
     5               printLine,
     6               page,
     7               closeFile) where
     8 
     9 import qualified System.IO as IO
    10 
    11 ^LopenFile s = IO.openFile s IO.WriteMode
    12 
    13 defineHeader :: IO.Handle -> String -> IO ()
    14 defineHeader handle heading = IO.hPutStrLn handle ("HEADER: " ++ heading)
    15 
    16 printLine :: IO.Handle -> String -> IO ()
    17 printLine = IO.hPutStrLn
    18 
    19 page :: IO.Handle -> IO ()
    20 page handle = IO.hPutChar handle '\f'
    21 ^LcloseFile :: IO.Handle -> IO ()
    22 closeFile = IO.hClose
$

慣れるまでは{-# OPTIONS -Wall -Werror #-}の記述を消さずに細かく型を指定していくことに。

0 コメント:

コメントを投稿