2010-01-01から1年間の記事一覧

文字列への強制変換

Lua

Lua では数値と文字列は相互に変換可能です。 http://ideone.com/zvnjL print( math.sin("1.0") ) -- OK print( string.byte(0) ) -- OK. "0" の文字コード(ASCIIの場合 48 ) これは通常、細かいことを気にしなくていいので割と便利なわけですが、 type 関…

boost::optional について

以前、 それでも Boost.Optional を使う、大きく分けて2つくらいの理由 - 野良C++erの雑記帳 という記事を書いたのですが、 その中の boost::optional に関して誤りがあったので、訂正したいと思います。 window.twttr = (function(d, s, id) { var js, fjs…

newproxy

Lua

Lua のユーザデータは、基本的に Lua を組み込む側で作るもので、純粋な Lua では使えません。 まぁ無くてもテーブルを使えばいいだけなのですが、テーブルだとオーバースペックだったり、 あるいは rawget/rawset によって破壊されてしまう恐れがあり、少し…

ようやく

Extra クリアできましたよ。これはいい懐中電灯。

どうにかこうにか(微バレ注意)

6ルート全てをクリアし、 Extra を出せましたよ(Normal)。 で、その Extra ですが…まぁシステム的に想像できた通り、はっちゃけてますね。 避けの力自体は、そこまで必要ないですが、少しでもパターンをミスるとガチで難しい。 どうにか道中を突破してボ…

「妖精大戦争 〜 東方三月精」初プレイ感想(微バレ)

東方の新作、とりあえず難易度のーまる Route A でワンコインクリアしました。 今回の東方は、なかなか異色。なんとなく花映塚みたいな感じです。 構成自体は普通の一人用シューティングなんですが、システム的に。 花映塚をパターン弾幕でやったら、こんな…

コミケ78、二日目に参戦してきました

コミケ、今年は行こうかどうか悩んでたけど、やっぱり行くことに。 サークルチェックした紙をカタログごと忘れるというトラブルはあったものの、 なんとか一番大事なアレだけは確保できました。1時間待ち。 というわけで、しばらく東方タイム。 体験版的な…

祝:「プログラミングの魔導書」発売

「プログラミングの魔導書」 のダウンロードが開始されました。 僕の使ってる Gmail では、パスワードを知らせるメールが何故か迷惑メール扱いされていたので、 もしまだメールが届いてない場合には、迷惑メールフォルダをチェックしてみるといいかもしれま…

間違った分割統治法

Lua

多値の結合 - 野良C++erの雑記帳 の実装コードが非効率的だったので、訂正します。 -- 補助関数 -- 引数をそのまま帰す function id(...) return ... end -- 引数の数を数える do local select = select function count(...) return select( "#", ... ) end …

多値の結合

Lua

Lua は、関数から複数の値(多値)を返すことの出来る言語です。 function f() return 1, 2, 3 end print( f() ) -- 1 2 3 そんな Lua を使っていると、割としばしば、「多値を結合したい」と思う場面に出くわします。 例えば…例えば、えっと、とっさに例が…

可変個引数処理のパフォーマンス比較

Lua

Lua で可変個引数を処理する方法には、主に三通りあります。 すなわち、再帰によって行う方法、テーブルを作る方法、標準関数selectを使う方法です: -- 再帰版 do local function add_impl_( x, y, ... ) if y == nil then return x end return add_impl_( …

何物でもない値

Lua

Lua でテーブルを使ったコード書いてると、しばしば、 「特定のフィールドを予め確保しておきたい」状況に出くわします。 例えば __index や __newindex をカスタマイズした場合に、 それらを無視してフィールドにアクセスする場合、普通は rawget/rawset を…

std::vector の shrink_to_fit

C++0x の std::vector には、新しく shrink_to_fit() メンバ関数が用意されています。 これは「 vector の確保しているメモリ領域を、その大きさに見合ったサイズまで縮小する」関数で、 典型的な使い方は、以下のような感じになります: // std::vector に…

「プログラミングの魔導書」の予約受付が再開されたようです

[Grimoire]「プログラミングの魔導書」予約開始! - Faith and Brave - C++で遊ぼう忘れないうちに予約予約、と。

インデックスアクセスと rawget/rawset は、どちらが高速か?

Lua

以下のスクリプトを書いてテストしてみた。 -- rawget と ls[k] および -- rawset と ls[k] = v は、どっちが高速か? -- 関数 f を n 回実行するのにかかった時間を測定する do local clock = os.clock function time( n, f, ... ) local oldtime = clock()…

関数の定義における落とし穴(解答編)

関数の定義における落とし穴(出題編) - 野良C++erの雑記帳 に対する解答例です。

関数の定義における落とし穴(出題編)

以下の Lua 関数 append は、第一引数として渡された配列形式のテーブルに、 第ニ引数以下で渡された配列形式のテーブルを全て追加するものである:http://ideone.com/SGfpS function append( t, t1, ... ) if t1 == nil then return end local n = #t for _…

Lua で using ディレクティブみたいなもの

Lua

最近 Lua でいろいろ書いてるのですが、 Lua の不満な点として、 標準ライブラリが全体的に最低限の機能しか無い点が挙げられます。 いや、 Lua という言語のコンセプトから考えると、これば別に不満点ではないですが、 それでも、ちょっと便利に使おうと思…

本物の C++er はデストラクタを書かない

代わりに std::unique_ptr (あるいは boost::scoped_ptr )を使います. 何故か? struct hoge { hoge() : xxx( get_resource() ) { /* 処理 */ if( some_cond ) throw some_exception(); /* さらに処理 */ } ~hoge() throw(){ release_resource(xxx); } /*…

自己代入チェックについて

驚くべきことに,世の C++er の中には,未だに 「自前のクラスを作る場合は,忘れずに代入演算子を定義し,自己代入チェックをしなければいけない」 という考えを持った人がいるようです. http://d.hatena.ne.jp/nagoya313/20100706/1278428503 確かに,昔…

だから concept が必要だったのに。

ところでこのソースコードを見てくれ。こいつをどう思う? http://ideone.com/3IjA2 #include <iostream> namespace A { // 適当な実装補助クラス class noncopyable { noncopyable( noncopyable const& ); void operator=( noncopyable const& ); protected: noncopya</iostream>…

句読点記号について

今まで何となく「、」「。」を使ってきたけど、 横書きで、かつ英単語などのアルファベットを多く書く場合には、 「,」「.」を使って書いた方が自然なのかもしれません。 というわけで,これからは「,」「.」も使っていこうと思います. 無論「、」「。…

std::complex の実部/虚部への参照を取得する

C++

例として、実部/虚部を別々にストリーム入出力させたいときとか。 それ reinterpret_cast で出来るよ! #include <complex> #include <cassert> #include <sstream> int main() { std::complex<double> z( 1, 1 ); double (&a)[2] = reinterpret_cast<double (&)[2]>(z); // well-formed assert( z.real() == a</double></double></sstream></cassert></complex>…

ファイルを BOOST_FOREACH で行ごとに処理したい

よーするに、こう書きたい。 BOOST_FOREACH( std::string line, lines( std::cin ) ) { // 入力の各行に対する処理 } std::getline を使ってループするのは美しくないですし。 多分 Boost 辺りを探せば有る…と思うんですが、見つからないです。 目撃情報求む…

C++ で Python の for を書きたい

Python の for 文って、 C++ のに比べて格好イイですよね。 # Python for i in range( 0, n ): # 0, 1, ... , n に対して処理する // C/C++ for( int i = 0; i < n; ++i ) { // 0, 1, ... , n に対して処理する } 単純に Python の方が短く書ける、というの…

std::tuple のメタ関数と get をちょっとだけ改良する

C++0x から新たに標準ライブラリに加わった「任意個の値の組」を扱うクラス std::tuple には、 std::tuple_size と std::tuple_element という二種類のメタ関数が用意されています: #include <tuple> #include <string> #include <type_traits> // std::is_same int main() { typedef st</type_traits></string></tuple>…

Boost.Optional は可能な限り trivial であるべきだ。

ちょっと前の記事で、 boost::optional のデストラクタは、 T のデストラクタが trivial であった場合でも 非 trivial になってしまうので、ちょっと嫌だなー、という旨を書きましたが、本の虫: C++0xにおけるPODの定義 を読んで、考え方が変わりました。 デ…

それでも Boost.Optional を使う、大きく分けて2つくらいの理由

Boost.Optional Must Go - 野良C++erの雑記帳 Boost.Optional Must Go (2) - 野良C++erの雑記帳 最近、何回かに分けて、 Boost.Optional について、(細かい)不満を日記に書いてきました。 これは別に Boost.Optional が嫌いだから不満を書いた訳ではな…

std::declval 関数テンプレート

C++0x では decltype によって「式の型」を得ることが出来ますが、 テンプレートメタプログラミングなんかで「ある型の変数を decltype 内で使いたい」って時には、 その変数をどうやって作るかが問題になります。 例えば T1 と T2 を乗算した結果の型が欲し…

Boost.Optional Must Go (2)

参考: C++でデストラクタを呼ばなくていい条件 - 野良C++erの雑記帳 http://ideone.com/PuFtN std::cout << boost::has_trivial_destructor< int >::value << std::endl; // true std::cout << boost::has_trivial_destructor< boost::optional<int> >::value <<</int>…