【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.1)

さて、前回の記事で作ったHaskellプログラム。いろいろと突っ込みどころがあります。
要するに「標準入力から読み込んで、HTMLソースを標準出力に出す」という制限の部分です。
だってあなた(自分)、ブログ書くときにコマンドプロンプト使うの?っていうことですよね。
確かにコマンドプロンプト自体はよく使うものですが、別にブログを書くときにまで使いたくはないですよね。
というわけでここを改善していきます。最低限利用できるプログラムにします。
どのように改良するのか。せっかくGHCはexeファイルを吐き出してくれる。
ですからファイルから読み込んでファイルから書き出すようないっぱしのプログラム形式にしてみたいわけです。
exeファイルとして使えるようになるので

  • exeファイルと同じところにあるsrc.txtというテキストファイルにリストを書いておく
  • このリストを読み出して、HTMLソースを作成する(前回のプログラム)
  • 最終的にexeファイルと同じところにあるhtmlsrc.txtに書き出す
このようにすればまだ使える感じがしてきますね、プログラムっぽいです。
というわけで前回のプログラムをうまく再利用しながらやっていきます。
前回のプログラムを再利用できるところ
getHtml :: String -> String
getHtml h = let wh = words h
number = head $ wh
title  = head $ tail $ wh
in do "<a href=\""
++ hreftp
++ number
++ ".html\"><strong>" ++ title ++ "</strong></a>"
リストからHTMLソースにする部分。ここはそのまま使えます。
結局標準入力と標準出力を使う代わりにファイル入力とファイル出力を使えばいいのです。
ファイル入出力はIOパッケージで利用できるのですが、いわゆる例外が発生します。
こんなファイルありませんよ?とか、このファイルには書き込めませんよ?とかいうやつです。
こういった実行時例外などへの対処は、本当はちゃんと書かないといけないところだと思います。
がしかし、結局自分が使うプログラムであるから、手の抜けるところは手を抜くという方針です。
よってこういったところは少し目をつぶり、とにかく簡単なファイル入出力をします。
まず次のように宣言します。
import IO
infile = "src.txt"
output = "htmlsrc.txt"
IOを使えるように、また入力ファイル名と出力ファイル名を固定しておきましょう。
さて、次のようにファイル入出力を行うプログラムは書けます。
main = do cs <- readFile infile
outhandle <- openFile output AppendMode
hPutStrLn outhandle header
hPutStr outhandle $ unlines $ map getHtml $ lines cs
hClose outhandle
簡単ながら説明していきましょう。
1.もっとも簡単でシンプルなファイル入力
標準入力を取ってくるgetContentsというものがありました。
また実行時引数を取ってくるgetArgsというものもあります。
これと似たように、簡単なファイル入力にはreadFileという関数が利用できます。

cs <- readFile filename

このようにすることで、あたかもgetContentsしているようにファイルから入力できます。
前に言っているとおり、細かい例外の処理などはありません。
このようにして持ってきた入力csをver.0のように処理することでHTMLを生成できます。
2.簡単なファイル出力の準備
出力時、今回は現在存在しているファイルの末尾に書いていくという追加書き込みを利用します。
C言語風に言うと”a”というモードで、HaskellではAppendModeという表現がされます。
こういったものを扱うために、ハンドラと呼ばれるものを経由した書き込みを行います。
ハンドラの宣言は次のように行われています。

outhandle <- openFile output AppendMode

変数名outhandleで、openFileというのがデータコンストラクタです。
データコンストラクタについては【Haskell】C言語の構造体のようなものをHaskellで利用するで書きました。
このデータコンストラクタにファイル名とハンドラのモードを与えることでファイル書き込みのための準備をします。
3.実際にファイル出力をする場所
標準出力putStrLnとputStrに対応するファイル書き込みようの関数がhPutStrLn及びhPutStrです。

hPutStrLn handler STRING
hPutStr handerl STRING

のようにすることでSTRINGをhandlerで設定しているファイルに書き込むことが出来ます。
4.後片付け
書き込みを行った後、hCloseという関数でハンドラの後処理を行います。
これを行わないと書き込みがちゃんと完了しないといった現象が発生します。
実行
さて、このようにして作成したプログラムに、リスト

3 【Haskell】とても簡単なHaskellプログラムについて
8 【Haskell】標準入力(stdin)を読み込むために
36 【Haskell】結構頻繁に使う関数などの話
37 【Haskell】高階関数と型の定義について
489 【Haskell】リストの処理について
509 【Haskell】C言語の構造体のようなものをHaskellで利用する
511 【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)

をsrc.txtとして置いておき、プログラムを実行して生成されるファイルhtmlsrc.txtからのコピペを張って終わります。


category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です