2011.12.10 関数型都市忘年会...
TRANSCRIPT
![Page 1: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/1.jpg)
最近書いた 関数型言語と関連する? C++プログラムの紹介
H.Hiro (Maraigue)
Web: http://hhiro.net/about/
Twitter: @h_hiro_
2011 関数型都市忘年会
![Page 2: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/2.jpg)
自己紹介
H.Hiro
![Page 3: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/3.jpg)
自己紹介
札幌C++から
来ました
![Page 4: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/4.jpg)
自己紹介
H.Hiro
• 大学院生(情報系)
• アルゴリズムを考案し、それを実装して 効果を確かめたりしています(主にC++利用)
• 最近、C++11の機能をいろいろと使いたいが ために、研究室のマシンをUbuntuを11に アップしました (gcc4.5標準搭載のため)
![Page 5: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/5.jpg)
自己紹介
H.Hiro
• 好んで使うもの:C++、Ruby、JavaScript
• 用途次第では使うもの:C#、Python、PHP
• 一応書けるもの:Perl、Java、etc...
![Page 6: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/6.jpg)
自己紹介
H.Hiro
• 好んで使うもの:C++、Ruby、JavaScript
• 用途次第では使うもの:C#、Python、PHP
• 一応書けるもの:Perl、Java、etc...
• まだ使えてないもの:Scala、F#、etc...
![Page 7: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/7.jpg)
自己紹介
• Twitter: @h_hiro_
• Facebook: 諸事情により非公開
• github: maraigue(まれーぐ)
• ブログ: LivedoorブログのID "maraigue"
• ニコ動: 探せば見つかります
![Page 8: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/8.jpg)
自己紹介(宣伝)
数学勉強会@札幌 • 大学数学の内容を取り扱ってます (現在は「群論」をやっています)
• 毎週土曜日の10:00~12:00に 開催 ※今週については 日曜10:00~12:00
• 公式サイト:ぐぐって!
![Page 9: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/9.jpg)
自己紹介(宣伝)
交通勉強会(trafficonf) • 主に首都圏のメンバーがやっている 勉強会ですが、私も乗っかってます (10/8 札幌でust観覧会を実施)
• 不定期開催(2~3ヶ月に1回)
• 次の開催は1/7
• 次の札幌開催は3/17?
• 公式サイト: 「交通勉強会準備会」でぐぐって!
![Page 10: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/10.jpg)
最近書いた 関数型言語と関連する? C++プログラムの紹介
H.Hiro (Maraigue)
Web: http://hhiro.net/about/
Twitter: @h_hiro_
![Page 11: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/11.jpg)
おことわり
別に、直接 "関数型言語" 的な
ことをするわけではないです
![Page 12: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/12.jpg)
おことわり
別に、直接 "関数型言語" 的な
ことをするわけではないです ※C++で、「直接 "関数型言語" 的なことをする」例:
Boost.勉強会 #6 札幌のuskz氏の発表 http://sites.google.com/site/boostjp/study_meeting/study6
![Page 13: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/13.jpg)
最近書いた 関数型言語と関連する? C++プログラムの紹介
H.Hiro (Maraigue)
Web: http://hhiro.net/about/
Twitter: @h_hiro_
![Page 14: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/14.jpg)
例題
与えられた文字列に対し、
「どの単語が何番目にあるか」を示す
連想配列を生成したい。
例えば
const std::string text = "I love C++";
という文字列があったとき、連想配列dataを
data["I"] == 0;
data["love"] == 1;
data["C++"] == 2;
となるようにしたい。
![Page 15: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/15.jpg)
回答例(1)
void position(const std::string & str,
std::map<std::string, size_t> & result){
size_t number = 0, begin_pos = 0, end_pos;
result.clear();
for(;;){
end_pos = str.find(' ', begin_pos);
if(end_pos == std::string::npos){
result[str.substr(begin_pos)] = number;
break;
}else{
result[str.substr(begin_pos, end_pos - begin_pos)] = number;
}
begin_pos = end_pos + 1;
number++;
}
}
![Page 16: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/16.jpg)
回答例(1)
void position(const std::string & str,
std::map<std::string, size_t> & result){
size_t number = 0, begin_pos = 0, end_pos;
result.clear();
for(;;){
end_pos = str.find(' ', begin_pos); // スペースの位置を発見して
if(end_pos == std::string::npos){
result[str.substr(begin_pos)] = number;
break;
}else{
result[str.substr(begin_pos, end_pos - begin_pos)] = number;
}
begin_pos = end_pos + 1;
number++;
}
}
![Page 17: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/17.jpg)
回答例(1)
void position(const std::string & str,
std::map<std::string, size_t> & result){
size_t number = 0, begin_pos = 0, end_pos;
result.clear();
for(;;){
end_pos = str.find(' ', begin_pos); // スペースの位置を発見して
if(end_pos == std::string::npos){
result[str.substr(begin_pos)] = number;
break;
}else{
result[str.substr(begin_pos, end_pos - begin_pos)] = number;
} // ↑その部分までの部分文字列をキーとし連想配列に渡す
begin_pos = end_pos + 1;
number++;
}
}
![Page 18: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/18.jpg)
回答例(1)
void position(const std::string & str,
std::map<std::string, size_t> & result){
size_t number = 0, begin_pos = 0, end_pos;
result.clear();
for(;;){
end_pos = str.find(' ', begin_pos); // スペースの位置を発見して
if(end_pos == std::string::npos){
result[str.substr(begin_pos)] = number;
break;
}else{
result[str.substr(begin_pos, end_pos - begin_pos)] = number;
} // ↑その部分までの部分文字列をキーとし連想配列に渡す
begin_pos = end_pos + 1;
number++;
}
}
!!!???
![Page 19: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/19.jpg)
回答例(1)
void position(const std::string & str,
std::map<std::string, size_t> & result){
size_t number = 0, begin_pos = 0, end_pos;
result.clear();
for(;;){
end_pos = str.find(' ', begin_pos); // スペースの位置を発見して
if(end_pos == std::string::npos){
result[str.substr(begin_pos)] = number;
break;
}else{
result[str.substr(begin_pos, end_pos - begin_pos)] = number;
} // ↑その部分までの部分文字列をキーとし連想配列に渡す
begin_pos = end_pos + 1;
number++;
}
}
関数型な方にとっては 普通なことなのかも
しれないけど
![Page 20: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/20.jpg)
回答例(1)
void position(const std::string & str,
std::map<std::string, size_t> & result){
size_t number = 0, begin_pos = 0, end_pos;
result.clear();
for(;;){
end_pos = str.find(' ', begin_pos); // スペースの位置を発見して
if(end_pos == std::string::npos){
result[str.substr(begin_pos)] = number;
break;
}else{
result[str.substr(begin_pos, end_pos - begin_pos)] = number;
} // ↑その部分までの部分文字列をキーとし連想配列に渡す
begin_pos = end_pos + 1;
number++;
}
}
文字列インスタンスを 別途生成するとか
(C++的には)言語道断!
![Page 21: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/21.jpg)
ポイント
関数型言語では、メモリや速度よりも
処理の実現方法を気にする傾向がある。
![Page 22: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/22.jpg)
ポイント
関数型言語では、メモリや速度よりも
処理の実現方法を気にする傾向がある。
(個人的な印象)
![Page 23: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/23.jpg)
ポイント
関数型言語では、メモリや速度よりも
処理の実現方法を気にする傾向がある。
(個人的な印象)
(例:変数への再代入を避ける)
![Page 24: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/24.jpg)
ポイント
関数型言語では、メモリや速度よりも
処理の実現方法を気にする傾向がある。
(個人的な印象)
でも、メモリを重視しなければ
C++の美学に反する。(個人的な印象)
![Page 25: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/25.jpg)
ポイント
関数型言語では、メモリや速度よりも
処理の実現方法を気にする傾向がある。
(個人的な印象)
でも、メモリを重視しなければ
C++の美学に反する。(個人的な印象)
メモリを節約しつつ、関数型言語くらいの
レベルで記法を簡略化したい
![Page 26: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/26.jpg)
回答例(2)
Boost::splitを使う (参考URL http://www.gesource.jp/weblog/?p=4531)
void position(const std::string & str,
std::map<std::string, size_t> & result){
std::list<std::string> splited;
boost::split(splited, str, boost::is_space());
size_t number = 1;
BOOST_FOREACH(std::string tmp, splited){
result[tmp] = number;
}
}
![Page 27: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/27.jpg)
回答例(2)
Boost::splitを使う (参考URL http://www.gesource.jp/weblog/?p=4531)
void position(const std::string & str,
std::map<std::string, size_t> & result){
std::list<std::string> splited;
boost::split(splited, str, boost::is_space());
size_t number = 1;
BOOST_FOREACH(std::string tmp, splited){
result[tmp] = number;
}
}
記述は分かりやすいけど でも文字列インスタンスを 別途生成してるだろ!
![Page 28: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/28.jpg)
つまりは
• すでに存在する文字列(constであることを 仮定してよい)の部分文字列を 1つの文字列として扱いたい ("I love C++" から "love" や "C++" を得たい)
• ただし、その「部分文字列」インスタンスを 作る際、文字列をコピーしてはならない
• でも楽に書きたい (substrが使えれば楽に書けるんだけど…)
…という状況が私の手元で発生したので
ライブラリを書いたのです。
![Page 29: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/29.jpg)
そのライブラリの名は
![Page 30: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/30.jpg)
そのライブラリの名は
http://www.flickr.com/photos/m-louis/3391434507/
Creative Commons 2.0 Attribution-ShareAlike
![Page 31: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/31.jpg)
そのライブラリの名は
fundoshi
http://www.flickr.com/photos/m-louis/3391434507/
Creative Commons 2.0 Attribution-ShareAlike
![Page 32: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/32.jpg)
そのライブラリの名は
fundoshi (「他人のふんどしで相撲を取る」より)
http://www.flickr.com/photos/m-louis/3391434507/
Creative Commons 2.0 Attribution-ShareAlike
![Page 33: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/33.jpg)
fundoshiについて
gist.githubにあります
https://gist.github.com/1372506
(「fundoshi C++」でぐぐっても出ます)
以下のコマンドで入手可能です git clone git://gist.github.com/1372506.git
![Page 34: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/34.jpg)
回答例(1)
void position(const std::string & str,
std::map<std::string, size_t> & result){
size_t number = 0, begin_pos = 0, end_pos;
result.clear();
for(;;){
end_pos = str.find(' ', begin_pos);
if(end_pos == std::string::npos){
result[str.substr(begin_pos)] = number;
break;
}else{
result[str.substr(begin_pos, end_pos - begin_pos)] = number;
}
begin_pos = end_pos + 1;
number++;
}
}
![Page 35: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/35.jpg)
回答例(3)
void position(const std::string & str,
std::map<fundoshi::string, size_t> & result){
size_t number = 0, begin_pos = 0, end_pos;
result.clear();
for(;;){
end_pos = str.find(' ', begin_pos);
if(end_pos == std::string::npos){
result[fundoshi::string(&(str[begin_pos]))] = number;
break;
}else{
result[fundoshi::string(&(str[begin_pos]),
end_pos - begin_pos)] = number;
}
begin_pos = end_pos + 1;
number++;
}
}
![Page 36: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/36.jpg)
実行例
int main(void){
std::map<fundoshi::string, size_t> result;
position("I love C++", result);
std::cout << result["I"] << std::endl;
std::cout << result["C++"] << std::endl;
std::cout << result["love"] << std::endl;
}
![Page 37: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/37.jpg)
実行例
int main(void){
std::map<fundoshi::string, size_t> result;
position("I love C++", result);
std::cout << result["I"] << std::endl;
std::cout << result["C++"] << std::endl;
std::cout << result["love"] << std::endl;
}
↓
0
2
1
きたこれ!
![Page 38: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/38.jpg)
簡単なリファレンス(1)
• クラス名
– template <class CharType> fundoshi::basic_string<CharType>;
– typedef basic_string<char> string;
– typedef basic_string<wchar_t> wstring;
※std::stringとかに名前を合わせてます メソッド名も基本的には合わせてます
![Page 39: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/39.jpg)
簡単なリファレンス(2)
• コンストラクタ – basic_string();
// 空文字列
– basic_string(const CharType * newstr, size_t length); // 文字列の一部を切り出す場合
– basic_string(const CharType * newstr); // '¥0'終端の文字列を使う場合
– basic_string( const std::basic_string<CharType> & newstr); // std::basic_string (std::stringなどを含む) を使う場合
![Page 40: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/40.jpg)
簡単なリファレンス(3)
• ポインタを貰う const CharType * c_str(void) const;
• 長さを取得 size_t length(void) const;
• 文字を取り出す CharType operator [](size_t pos) const;
• 文字列比較 bool operator ==(const basic_string<CharType> & other) const; bool operator < (const basic_string<CharType> & other) const; bool operator <=(const basic_string<CharType> & other) const; bool operator > (const basic_string<CharType> & other) const; bool operator >=(const basic_string<CharType> & other) const;
![Page 41: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/41.jpg)
おことわり
APIは
(今のところ)これで
全部です!
![Page 42: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/42.jpg)
おわりに
• 私はよくRubyも使ってるのだが Rubyに慣れてしまうと C++って記法がエレガントじゃないよね
• だから記法にこだわっている
• boostとかその点頑張ってるっぽいので タイミングを見て勉強してみたいです
![Page 43: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/43.jpg)
おわりに
(再掲)
関数型言語
あまり関係なかった。
本当申し訳ない。
![Page 44: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/44.jpg)
おわりに
(もし時間が余ったら)
もう一つ「記法にこだわる」
ネタをします
![Page 45: 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」](https://reader033.vdocuments.net/reader033/viewer/2022052910/559ca05c1a28ab273f8b472e/html5/thumbnails/45.jpg)
おわりに
ありがとう
ございました