2012-01-01から1ヶ月間の記事一覧

Sprout.Weed でコンパイル時四則演算のパース

とりあえず、自力で書いてみました。 構文解析とかあんまりやったことが無いので、もっと簡単なやり方がありそうですね。 コードがだいぶアレな感じになってしまってぐぬぬ。 多分問題ない…はず。 ちなみに括弧は対応していないです。 [ソース] #define SPRO…

Sprout.Weed で変換不可能な文字列の位置を取得する

strtol の第二引数と同じですね。 メンバ関数 current() で取得出来るみたいです。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> int main(){ namespace w = sprout::weed; { static constexpr auto data = sprout::to_</sprout/weed.hpp>…

Sprout.Weed で改行コードにマッチするパーサ

weed::eol を使用します。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> #include <iostream> #include <sprout/array.hpp> #include <sprout/tuple/array.hpp> #include <sprout/string/alias.hpp> template<typename Parsed> struct parsed_holder{ constexpr operator bool(…</typename></sprout/string/alias.hpp></sprout/tuple/array.hpp></sprout/array.hpp></iostream></sprout/weed.hpp>

unite.vim で候補ごとに default_action を設定する

vim

先日書いた記事なんですが、コメントでやり方を教えていただいたので覚書。 kind で default_action を設定すれば出来るみたいです。 [unite-qfixlist] let s:source = { \ "name" : "qfixhowm", \ "description" : "qfixhowm", \} function! s:source.gathe…

OGLplus 0.9.0

すっかり忘れていたんですが、いつの間にか OGLplus が 0.9.0 になっていました。 oglplus-0.9.0 - sourceforge あと破壊的な変更点があったのでいくつか。 Matrix4f と Matrix4d の名前が変更 名前が変更されました。 Matrix4f → Mat4f Matrix4d → Mat4d な…

Vim script で repeat

[ソース] function! s:main() echo repeat("無駄", 5) echo repeat("ほむ", 10) endfunction call s:main() [出力] 無駄無駄無駄無駄無駄 ほむほむほむほむほむほむほむほむほむほむ (…今まで join と map を使っていたなんて言えない。

QFixHowm のリストを unite.vim で出力する

欲しかったのでちょっと書いてみました。 [unite-qfixlist] let s:source = { \ "name" : "qfixlist", \ "description" : "qfixlist", \ "action_table" : { \ "new_memo" : { \ "is_selectable" : 0, \ } \ } \} function! s:source.action_table.new_memo.…

Vim の sessionoptions に globals が含まれている場合の不具合?

vim

すごくピンポイントなんですが、小数を代入したグローバル変数を定義します。 let g:Hoge = 1.1 この時に sessionoptions に globals が含まれている場合、mksession で次のような書き込みがされ、source 時にエラーになります。 let Hoge = &1.100000 これ…

Sprout.Weed を使って余白を取り除く

出来そうだったのでやってみた。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> #include <iostream> template<typename Parsed> struct parsed_holder{ constexpr operator bool() const{ return parsed.success(); } template<typename T> constexpr bool oper</typename></typename></iostream></sprout/weed.hpp>…

Sprout.Weed で終端(first == end)にマッチするパーサ

weed::eoi を使用します。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> template<typename Parsed> struct parsed_holder{ constexpr operator bool() const{ return parsed.success(); } template<typename T> constexpr bool operator ==(T&& t) c</typename></typename></sprout/weed.hpp>…

Sprout.Weed で複数の文字列をパースする場合に文字列が連結されるのを回避する

さて、 homu:mado のような『:』区切りの構文をパースする場合、 namespace weed = sprout::weed; static constexpr auto parser = *weed::lim<4>(weed::char_ - ':') >> ":" >> *weed::lim<4>(weed::char_); のようなパーサを記述すると思います。 しかし、…

unite-toggle-options

vim

unite.vim を使用して、切替オプションの設定を行います。 こちらも unite-checking-global-variables と同様にチェックボックス表記です。 手動でガシガシ書いたので抜けがあるかも知れませぬ。 [Vimプラグイン] unite-set-toggle-options - github NeoBund…

unite-checking-global-variables

vim

名前が無駄に長いんですが、0 と 1 のグローバル変数を unite.vim で編集する unite-source です。 要はチェックボックスですね。 元々は unite.vim でチェックボックスを記述する為のテストソースとして書いていたんですが、そのままでも使えそうだったので…

Sprout を使った簡単な constexpr counting_iterator

Sprout の index_iterator で簡単に実装出来そうだったのでちょっと試してみた。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/algorithm/transform.hpp> #include <sprout/iterator/index_iterator.hpp> #include <sprout/array.hpp> #include <sprout/pit.hpp> #include <iostream> template</iostream></sprout/pit.hpp></sprout/array.hpp></sprout/iterator/index_iterator.hpp></sprout/algorithm/transform.hpp>

Sprout.Variant の覚書

ちょっとハマったことがあったので覚書 [比較] Sprout.Variant で比較を行う場合、型が合っていないとエラーになります。 typedef sprout::variant<int, float> var_type; static constexpr var_type x{10}; static_assert(x == 10, ""); static_assert(x != 0.0f, ""); </int,>…

vim-powerline でステータスラインをカラーリングする

vim

見てもらえれば分かると思いますが、ステータスラインをカラーリングしたりプラグインです。 知っている人は知っている、気になっていた人は気になっていた EasyMotion のスクリーンショットに載っていたアレですね。 カラーリング以外にも色々と設定出来る…

constexpr でエラー出力

C++

例えば、次のような除算を行う関数で、ゼロ除算の場合にエラーを出力したいと思います。 constexpr int division(int a, int b){ return a / b; } constexpr int x1 = division(4, 2); // ok constexpr int x2 = division(4, 0); // ゼロ除算を行うのでエラ…

Vim でファイルが存在しないバッファの削除

vim

例えば、vimshell や unite.vim などといったファイルが存在しないバッファの削除を行います。 [ソース] function! s:delete_no_file_buffer() let list = filter(range(1, bufnr("$")), \ 'bufexists(v:val) && !filereadable(expand("#".v:val.":p"))' \ )…

Sprout.Weed で符号なし10進数のパーサ

Sprout.Weed では以下の符号付き10進数のパーサが用意されています。 Expression Attribute uint_ std::uintmax_t uint8 std::uint8_t uint16 std::uint16_t uint32 std::uint32_t uint64 std::uint64_t [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_C…

Sprout.Weed で連続したスペースを無視する

*weed::omit[a]という記述で連続した a を無視することが出来ます。 これを利用して連続したスペースを無視します。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> template<typename Parsed> struct parsed_holder{ constexpr operator b</typename></sprout/weed.hpp>…

Vim で隠れバッファを全て削除する

そういう機能が欲しかったのでちょっと Vim script を書いてみました。 既存の機能でもっと簡単に出来るかも。 [ソース] function! s:delete_hide_buffer() let list = filter(range(1, bufnr("$")), "bufexists(v:val) && !buflisted(v:val)") for num in l…

Vim で復活の呪文を使う

Vim Advent Calendar 2011 46日目の記事になります。 特に Vim Advent のネタにする予定もなかったのですが、他に書く人もいなさそうなので、46日目にしました。 こんな感じで書きたいことがあれば各々が好きなように Vim Advent に投稿すればいいと思います…

Sprout.Weed で特定の構文を無視する

weed::omit を使用して特定の構文を無視することが出来ます。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> template<typename Parsed> struct parsed_holder{ constexpr operator bool() const{ return parsed.success(); } template<typename T> co</typename></typename></sprout/weed.hpp>…

Sprout.Weed でどちらかにマッチするパーサを書く

演算子を使用して // 数値かアルファベットにマッチするパーサ weed::int_ | weed::alpha のようなパーサを記述することが出来ます。 また、上記のパーサだと attribute の型は sprout::variant<std::intmax_t, char> のように sprout::variant 型になります。 [ソース] #define S</std::intmax_t,>…

Sprout.Weed で符号付き10進数のパーサ

Sprout.Weed では以下の符号付き10進数のパーサが用意されています。 Expression Attribute int_ std::intmax_t int8 std::int8_t int16 std::int16_t int32 std::int32_t int64 std::int64_t [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_I…

Sprout.Weed の parse をラップしてみた

テストしやすいようにちょっとラップしてみました。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> template<typename Parsed> struct parsed_holder{ constexpr operator bool() const{ return parsed.success(); } template<typename T> constexpr b</typename></typename></sprout/weed.hpp>…

Sprout.Weed で特定の文字をマッチさせない

次のように特定の文字まで文字列を読み込む場合に、マイナス演算子を使用して、特定の文字をマッチさせないようにします。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> template<typename Char, std::size_t N, typename Parser> constexpr bool check_parser(Char con</typename></sprout/weed.hpp>…

Vim script の型について

vim

Vim Advent Calendar 2011 43日目の記事となります。 もはや Advent Calendar がなんなのかわからなくなってきましたね。 明日以降、誰が書くか未定なので、もし書いた or 書きたい人がいれば ATND のコメントに投稿して下さい。 特にもう日付を気にする必要…

Sprout.Weed で複数文字の取得

weed::char_ と weed::lim を利用して複数の文字のパースを行います。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> template<typename Char, std::size_t N, typename Parser> constexpr bool check_parser(Char const(&str)[N], Parser&& parser){ using sprout::weed</typename></sprout/weed.hpp>…

Sprout.Weed で test_parser

Boost.Spirit.Qi のドキュメントに載っている test_parser を Sprout.Weed でも書いてみました。 ただし、関数内で static_assert はできないので、結果の出力は実行時に行います。 コンパイル時にチェックを行いたい場合は、check_parser で static_assert …