No Such Blog or Diary
genericタイプの配列 in Java
知らずに引っかかってしまったが,ここらへんの記述によると generic の配列は作れないそうな.代わりに Vector を使えばいいのだけど Java の Vector はアクセスが面倒…
- Comments: 0
- TrackBack (Close): -
変なコード?
g++ (GCC) 3.3.5-20050130 (Gentoo 3.3.5.20050130-r1, ssp-3.3.5.20050130-1, pie-8.7.7.1) で以下のコードがエラー無くコンパイルされた.3.4.4 とか VC++ (VS.NET 2005) ではコンパイルできなかったのに…
#include <iostream> #include <string> int main(int argc, char *argv[]) { for({std::cout << "Hello?" << std::endl; std::cout << "world?" << std::endl; } 0 ; 0) { std::cout << "loop?" << std::endl; } return 0; }
- Comments: 0
- TrackBack (Close): -
Haskell の導出インスタンス
data と newtype の宣言で deriving つけたらインスタンスが自動生成されることを始めて知った… Eq、Ord、Enum、 Bounded、Show、 Read に対して使えるようでかなり手間が省ける.
- Comments: 0
- TrackBack (Close): -
あまり見ない C++ コード
ひとつ目.switch の後に { } がない(switch の意味が無いが…).return でカンマ区切りの式.throw がカンマ区切りをともなってネスト.
#include <iostream> int main(int argc, char *argv[]) { try { switch(argc) case 1 : return std::cout << "no argument!" << std::endl, 0, throw (1,throw 9,2), 1; } catch (int k) { std::cout << "cought exception: " << k << std::endl; } return 0; }
どうやらこのコードでは 9 が投げられるらしい.
二つ目.Pointer to Member Function: .* and ->*
#include <iostream> struct Base { virtual void f() { std::cout << "Base! " << std::endl; } }; struct DerivedA : public Base { int k; DerivedA(int kk) : k(kk) {}; void f() { // オーバーライド std::cout << "DerivedA with k = " << k << std::endl; } }; struct DerivedB : public Base { }; int main(int argc, char *argv[]) { DerivedA *pobjA, objA(5); DerivedA objA2(3); DerivedB objB; typedef void (Base::*f_type)(); f_type f_base = &Base::f; pobjA = &objA; (objA2.*f_base)(); (pobjA->*f_base)(); (objB.*f_base)(); }
なんに使えるのかよくわからないが,とりあえずちゃんとオーバライドした関数も呼ばれる.
- Comments: 0
- TrackBack (Close): -
C++のコメントを抜き出す by Haskell
C++ のソースからコメントだけを抜き出したい衝動に駆られたのでおもむろに Haskell で実装.やはり簡単なプログラムの実装は Haskell のほうが簡単だ…
-- Extract C++ comments from stdin import List import System -- for C-style comments, i.e. /* comments... */ judgeC (t,c) (c1,c2,c3) = if t==0 && c2=='/' && c3=='*' then (1,0) else if t==1 && c1=='*' && c2=='/' && c > 2 then (0,0) else (t,c+1) -- for C++-style comments, i.e. /* comments... */ or // comment... \n judgeCXX (t,c) (c1,c2,c3) = if t==0 && c2=='/' && c3=='/' then (2,0) else if t==2 && c2=='\n' then (0,0) else judgeC (t,c) (c1,c2,c3) unfilterComments x judge = let dx = (zip3 (" "++init x) x (tail x++" ")) cms = scanl judge (0,0) dx cms' = zipWith (\(c1,_) (c2,_) -> c1 > 0 || c2 > 0) cms (tail cms) in map (\(x,c) -> x) (filter (\(_,c) -> c) (zip x cms')) main = getArgs >>= (\args -> getContents >>= (\x -> putStr (unfilterComments x (if not (args ==[]) && head args == "-c" then judgeC else judgeCXX))))
- Comments: 0
- TrackBack (Close): -
どうでもよいけど微妙な驚き
Haskell の多倍長演算の中身は GMP だったのねと.GHC をコンパイルして初めて気づいた.ほんと,どうでもいいことだ…
- Comments: 0
- TrackBack (Close): -