C++初心者がC++11で
parserを書いてみたはなし
id:karupanerura
about me
• id:karupanerura
• github/twitter/…
• Perl/JavaScript/Java/C99/…
• emacs派 (自由なeditor)
• Mobile Factory, Inc.
• Social App Engineer
• Web/Android/HTML5/…
どのくらい初心者か
• 8年くらいぶりにC++を書いた
• Cに毛が生えた程度のコードしか書いてなかった
• boostは触った事はあるけど忘れた
• templateを(C++では)使った事がない
• constexprを(存在は知っていたが)使った事がない
偽のC++プログラマ
なぜここにきているか
• CでC++を書いたことはある
• ちゃんとC++勉強したい
• cocos2d-x 3.0 で良くなったらしいので触ってみたい
• XS(PerlのC bindingの実装用の独自言語)でC++が使える
• 勉強会に行くと最近の流行りとかが体系的に分かって良さ
そうだ
しかし、通常枠は補欠もたくさ
んいて入れそうにない
そうだ、LTをしよう
lisp1 parser
C++11なんかだいぶ書きやすくなったらしいじゃん?
lisp parserくらいなら楽に書けるんじゃね?(雑)
便利だった機能
auto
型推論サイコー!
auto
• 「あー。やっぱここの型変えないとだめだわー。」
• みたいなときに、書き換える箇所が少なくなる。
• 型の名前がtemplateによってめっちゃ長くなってしまっ
たときでも、「autoあるし、まあ、いいよ。仕方ないよ
ね。」って思えて優しい気持ちになれる
• そもそも型名がめっちゃ長くなるようなコードは筋が
悪い?
std::shared_ptr/std::unique_ptr
GCサイコー!
smart pointer
• ポインタ事故
• deleteのタイミングミスるとsegvして死ぬ
• deleteを忘れるとmemory leakして死ぬ
• shared_ptrを使うと参照をカウントして、参照している
箇所が0になれば勝手に解放してくれる
• 安全にポインタが使える
smart pointer
• うっかり多用し過ぎるとめっちゃ長くなる
• vector<shared_ptr<Foo<shared_ptr<Bar>>>>
• は????????? ってなる
• オブジェクトのライフサイクルをちゃんと考えて設計し
ないとこうなる
• 自戒
for(type var : array)
foreachサイコー!
for(type var : array)
• Javaの拡張for文みたいなやつがついにC++に!!
• iteratorとかを使って素のc likeなforを書くより遥かにミ
スが少なくなってよい
• autoと組み合わせる事で動的型付け言語でループ書くの
と大差無いくらいスッキリする
• 普通にループ回すだけなら使わない手はない
で、実装は?
• github.com/karupanerura/cpp-mylisp
• に上げるつもりだったけど上げてない
• 中3女子の人のconstexprに関する発表と成果物に感銘
を受けて「オブジェクト志向サイコー!」って感じで書
いてたparserのコードを全て捨てたくなった
• というか、設計が雑過ぎて相互includeが出来て
redefinition errorが出てモチベーションが枯れた
これから
• constexprを使ってリファクタリングしてみる
• 理解できたら、Sprout.Weed を使ってみる
• constexprサイコー!って言いたい
• BOOST_PPで頑張ってみる
• マクロの深淵を覗いてみる
参考書
• http://ezoeryou.github.io/cpp-book/C++11-Syntax-
and-Feature.xhtml
感想
• C++おくがふかい
• まじでおくがふかい
• 今日1日でだいぶとっかかりつかめた気がする
• 今日1日でコンパイル時処理にだいぶ染まった気がする

dwangocpp1-lt