エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

Haskell

IOArray

Haskellで使う配列。Arrayもあるけれど、効率が悪い(らしい)のでIOArrayを使ってみる。ghciにて。 Prelude> :m Data.Array.IO IOArrayを使うためにData.Array.IOを読み込み。 Prelude Data.Array.IO> a :t a a :: IOUArray Int Int newArrayで新しい配列を作…

正規表現の使い方

正規表現の使い方を知ったので忘れないうちに。 grepっぽいの。 import System.Environment import Text.Regex grep ptn ss = [s| s <- ss, matchRegex (mkRegex ptn) s /= Nothing] main = do args <- getArgs s <- getContents mapM_ putStrLn $ grep (hea…

FizzBuzz

http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm問題の定義が曖昧、という意見もありますが。そこんところはちょっと目をつぶって。 Haskellでこんな感じ? fizzBuzz x | x `mod` 15 == 0 = "FizzBuzz" | x `mod` 5 == 0 = "Buzz…

selectを知った

今日になって、Rubyの配列やハッシュにselectというメソッドがあるのを知った。 Rubyを使い始めて何年目。Enumerableの存在は知っていたものの、きちんと調べたことがなかったなぁ。始めて使ったselectは、こんな感じ。 Info = Struct.new(:id, :name) infos…

ゲームになった…か?

amazon:入門Haskellを参考に、判定を追加してみたものの。スコア計算をどうしたものか。困った。スマートな方法が思いついていません。以下、コード。

ゲーム画面を作る

2日ほどこねくり回してようやくゲーム画面に相当するものができた。乱数の扱いが、最初いまひとつピンとこなかったのだけれど、ようやく把握…できたと思う。 以下、コード。

位置を記憶させる

昨日は再表示すると画像が消えてしまっていたけれど、IORefを使ってポイントを覚えさせておいて、再表示のときに全てのポイントを再描画させることに成功。細かいところがいろいろ変わっているけれど気にせずに。 import Graphics.UI.GLUT import Control.Ex…

半端にOpenGLに手を出す

MonadiusがOpenGLでグラフィックを作っているのを見て、amazon:入門HaskellのさめがめをOpenGLで作り直してみようかと、中途半端にいろいろ手を出してみる。クリックしたところに八角形を表示するのができた。ウィンドウが再表示されると表示が消えてしまい…

双子素数をHaskellでも計算してみた。

HaskellのIntegerが大きい数を扱える、ということで「双子素数の大きさ、記録更新 - rubyco(るびこ)の日記」を思い出した。計算してみる。 Prelude> print $ length $ show $ 2003663613 * (2::Integer) ^ 195000 58711Haskellでも計算できた。確かに58711…

番号を振る

numbering :: [String] -> [String] numbering ss = map format $ zip [1..] ss where format (n,s) = setw 6 (show n) ++ ": " ++ s setw n s = replicate (n - length s) ' ' ++ s amazon:ふつうのHaskellプログラミングにもこの例はあるんですが、興味を…

計算機、のパーサ、その3

どうにかここまで整理。 module Main (main) where import Text.ParserCombinators.Parsec -- 数式の要素(四則演算の演算子と整数値) data Elem = Plus | Minus | Times | Divide | Value Integer -- 後置法(逆ポーランド)で格納された要素を計算する関数 ca…

計算機、のパーサ、その2

昼休みの時間を使って中置表記のパーサを考えてみる。 まだいろいろわかってません。結構必死です(苦笑)。 expression :: Parser [Elem] expression = do { many space; t <- term; ts <- many $ try terms; many space; return $ t ++ (concat ts) } where …

計算機、のパーサ

Parsecを使ってパーサを作ってみる。今のところ単純に要素を読み出しただけ。Elemの定義は昨日と一緒。 import Text.ParserCombinators.Parsec -- 数値パーサ number :: Parser Elem number = do ds <- many1 digit return $ Value $ read ds -- 演算子パー…

計算機

最初にパーサを書くのが正当なような気がするものの。先に内部表現を書いてしまうのが「あ、やっぱりオレだ」と思う瞬間。昔、インタプリタを書いたときもそうだったっけ。 data Elem = Plus | Minus | Times | Divide | Value Int calc :: [Elem] -> Int ca…

TabをSpaceに展開

tabToSpace tabSize s = tabToSpace' tabSize s where tabToSpace' _ "" = "" tabToSpace' 0 s = tabToSpace' tabSize s tabToSpace' i ('\t':cs) = (take i $ repeat ' ') ++ (tabToSpace' tabSize cs) tabToSpace' i (c:cs) = c:(tabToSpace' (i-1) cs)

Haskellでcatコマンド(例外処理付き)

import System cat :: [String] -> IO () cat [] = getContents >>= putStr -- 標準入力 cat [f] = catch (readFile f >>= putStr) -- 任意のファイル(例外捕捉付き) (\e -> putStr ("CANNOT OPEN " ++ f ++ "\n")) cat (f:fs) = cat [f] >> cat fs -- 複数…