2007-04-01から1ヶ月間の記事一覧
2日ほどこねくり回してようやくゲーム画面に相当するものができた。乱数の扱いが、最初いまひとつピンとこなかったのだけれど、ようやく把握…できたと思う。 以下、コード。
昨日は再表示すると画像が消えてしまっていたけれど、IORefを使ってポイントを覚えさせておいて、再表示のときに全てのポイントを再描画させることに成功。細かいところがいろいろ変わっているけれど気にせずに。 import Graphics.UI.GLUT import Control.Ex…
MonadiusがOpenGLでグラフィックを作っているのを見て、amazon:入門HaskellのさめがめをOpenGLで作り直してみようかと、中途半端にいろいろ手を出してみる。クリックしたところに八角形を表示するのができた。ウィンドウが再表示されると表示が消えてしまい…
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プログラミングにもこの例はあるんですが、興味を…
ちと長くなってしまった。 STLと連携できるように、イテレータも定義したいところ。 #include <limits> template<int N> class BitArray { public: typedef unsigned int ValueType; static const int BitsPerValue = std::numeric_limits<ValueType>::digits; static const int ArrayS</valuetype></int></limits>…
どうにかここまで整理。 module Main (main) where import Text.ParserCombinators.Parsec -- 数式の要素(四則演算の演算子と整数値) data Elem = Plus | Minus | Times | Divide | Value Integer -- 後置法(逆ポーランド)で格納された要素を計算する関数 ca…
昼休みの時間を使って中置表記のパーサを考えてみる。 まだいろいろわかってません。結構必死です(苦笑)。 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…
今度は書き込む方。BYTEとかの定義はReaderと同じと思ってください。 同じように抽象クラス。 class Writer { public: virtual ~Writer() {} void writeByte(BYTE value) { write(value); } void writeHalf(HALF value) { writeByte(static_cast<BYTE>(value >> BI</byte>…
レビュー三昧の毎日。今のプロジェクトのように、ウォーターフォール型のプロセスを踏んでソフトウェア開発をしていると(ウォーターフォールで作ってるのかよ、というツッコミは、ここでは聞き流します)、同じ時期に同じ作業が重なってしまいます。そんなわ…
まずは骨格になる抽象クラス。 typedef unsigned char BYTE; typedef unsigned short HALF; typedef unsigned long WORD; static const int BITS_PER_BYTE = 8; static const int BITS_PER_HALF = BITS_PER_BYTE * 2; static const int BITS_PER_WORD = BITS…
自分自身が管理されるのが嫌いだからなのか、それとも人を管理する能が自分にないからなのか。人の管理っていったいなんだろうね、とこのところひどく思います。できるものはできるし、できないものはできない。できるとできないとのどちらに転ぶかは実践者…
#include <iostream> #include <fstream> #include <functional> void write(const char* filename) { std::ifstream file(filename); if(file.good()) { std::cout << file.rdbuf(); } else { std::cout << "CANNOT OPEN " << filename << '\n'; } } int main(int argc, char* argv[]) { if</functional></fstream></iostream>…
#include <string> std::string tabToSpace(int tabSize, const std::string& s) { std::string result; int spacingSize = tabSize; for(std::string::const_iterator i = s.begin(); i != s.end(); ++i) { if(*i == '\t') { result += std::string(spacingSize, ' </string>…