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

LLVM/Clang 3.7 がリリース

いつの間にか 3.7 がリリースされていました。 リリースノートは以下の通り LLVM 3.7 Release Notes LLVM 3.7 documentation

Boost.TypeErasure のミニマム実装

その昔に書いたコードを発掘したので載せてみるなど。 このコードは Boost.TypeErasure がリリースされた頃に書いたので、現在の実装はまた別のものになっているかも知れない。 [コード] #include <iostream> #include <boost/any.hpp> template<typename Concept, typename T> struct adapter{ static void apply(bo</typename></boost/any.hpp></iostream>…

C++ で std::vector<派生クラス> から std::vector<基底クラス> に変換する

C++

さて、C++ では次のような std::vector<派生クラス> から std::vector<基底クラス> への 暗黙的な変換はできません。 struct base{ }; struct derived : base{ }; std::vector<derived*> ary; // base は derived の基底クラスなので変換を期待するが、こういう変換は</derived*>…

std::vector で参照を保持したい

C++

std::vector<T&> みたいに std::vector で参照値を保持したい事があると思いますが、これはコンパイルエラーになってしまいます。 この問題を回避したい場合は、C++11 で追加された std::reference_wrapper を利用する事ができます。 [コード] #include <vector> #includ</vector></t&>…

std::reference_wrapper の参照元に T 型の値を代入する

C++

std::reference_wrapper<T> は std::ref() 等で返ってくるクラスなんですが、参照元に T 型の値を代入するときにちょっと気になったので覚書。 さて、次のように std::reference_wrapper<int> で保持している参照元に対して整数を代入する場合、コンパイルエラーにな</int></t>…

Ruby の Class.new で生成したオブジェクトを受け取る変数名によって挙動が変わる

どういうことかというと大文字から始まる変数名と小文字から始まる変数名では #class で返ってくる値が違いました。 X = Class.new X.new.class # => X x = Class.new x.new.class # => #<Class:0x000000016871c0> Ruby キモい(確信</class:0x000000016871c0>

unite.vim でサブアクション的なものを定義する

Vim

元々は本体に要望していた機能だったんですが、最近簡単に定義できる方法を思いついたので書いておきます。 概要としては、デフォルトアクションとは別に source で共通したキーマッピングのアクションがほしいというものでした。 (<Leader><CR> を入力した時に source-f</cr></leader>…

C++ では void* から他のポインタ型へ暗黙的に変換できない

C++

今まで知らなかったので覚書。 C++ では void* 型から他のポインタ型へ暗黙的に変換することはできない。 なので、次のようなコードはエラーになる。 void* vp; // error: cannot initialize a variable of type 'int *' with an lvalue of type 'void *'; i…

Ruby の class/module 定義式の戻り値

Ruby では class や module 定義も式なので戻り値があります。 class や module の定義式の戻り値は『最後に評価した式の結果』になります。 # 最後に評価式を返す # この場合は最後に定義したメソッドの戻り値を返す result = class X def method1 end def …

Ruby のメソッド定義式の戻り値

Ruby ではメソッドの定義(def)も式なので戻り値があります。 # メソッド定義の戻り値はメソッド名の Symbol name = def plus a, b a + b end p name # => :plus これって何かに利用できるのだろうか。 [おまけ] 式なので当然、以下のようなコードを記述す…

Ruby の break に引数を渡す

Ruby の break に引数を渡すと、そのループの戻り値になります。 data = [4, 2, 6, 7, 5, 3, 1, 8, 9] # 配列の中から最初に現れる奇数を探す result = for i in data if i % 2 != 0 break i end end result # => 7 # #each でも利用できる result = data.ea…

Ruby で #each_with_self を書いてみた

これを簡単に書けるようにしてみたくて書いてみた。 class Enumerator def with_self &block with_object self, &block end end module Enumerable def each_with_self &block each_with_object self, &block end end [1, 2, 3].each_with_self { |it, mysel…

Ruby で block 内からレシーバのオブジェクトを参照したかった

意図としては以下のように block 内で呼び出したレシーバを参照したい。 [1, 2, 3].map { |it| it + self.size # block 内でレシーバのオブジェクトを参照したい } # => [4, 5, 6] しかし、block 内のスコープでメソッドやオブジェクトを参照した場合、定義…

ユーザ定義リテラル(と Sprout)を利用してテンプレート引数に float 値を渡す

C++

さて、テンプレート引数には int 型等の整数値を直接渡すことはできますが、float 値を直接渡すことはできません。 // こういう風に float 値を受け取ることはできない template<float F> struct X{ ... }; こういう場合、std::ratio みたいに分子と分母に分けて整数</float>…

C/C++ で予約済み識別子をシンタックスハイライトするプラグインつくった

他人の書いた C/C++ のコードを見ているとあまりにも予約済み識別子を無視してコードを書いているものが多いので、ついカッとなってつくった。 プラグイン osyo-manga/vim-cpp-syntax-reserved_identifiers NeoBundle 'osyo-manga/vim-cpp-syntax-reserved_i…

Google 日本語入力の Godan を使ってみた所感

元々スマホではケータイ配列でフリック入力を使っていたんですが、最近どうにも Google 日本語入力が重すぎてレスポンスがめちゃくちゃ悪い(特に濁点の入力が半分ぐらいの確率で入力されない)ので Godan という入力方法を試してみました。 Godan について…

Ruby の Enumerable#each_with_index で index の初期値を指定する

Enumerable#each_with_index を利用すると index を付属してループする事ができます。 ["homu", "mami", "mado"].each_with_index { |it, i| puts "#{i} : #{it}" } # => 0 : homu # 1 : mami # 2 : mado index の初期値を指定してループする index の初期値…

Ruby では空白を間に挟んだ文字列リテラルは結合される

例えば、次のように空白を挟んだ文字列リテラルを連続で記述した場合、それは1つの文字列として結合されます。 # 空白を挟んで定義すると1つの文字列として結合される s = "homu" "mami" "mado" # => "homumamimado" # こういう風に書いても結合される ss = …

Ruby の Enumerable#each_with_index を自前で実装してみた

Enumerable#each_with_index の実装がどうなっているのか知りたかったんですが、どうやら C で書かれているようなので自分で Ruby を使った実装を書いてみた。 module Enumerable def each_with_index2 &block if block_given? index = 0 each { |it| block.…

Ruby で引数に配列を受け取る際の受け取り方いろいろ

Hash#map の引数の受け取り方で悩んでたんですが、つまりこういう事か。 # ブロックに配列を渡す def test &block block.call [1, 2, 3] end # 引数がひとつだけの場合はそのまま配列になる test { |a| p a # => [1, 2, 3] } # 配列の要素数よりも引数が少な…

Ruby の iolite を Hash#map に渡す場合の注意

さて、iolite を利用するとブロックを抽象的に記述する事ができるのですが、Hash#map に渡すときに注意する必要があります。 例えば、 homu = { "name" => "homu", "age" => "14"} # これを iolite を使って抽象化したい homu.map { |key, value| key + " : …

Ruby の Hash#map に渡すブロックは引数の数によって受け取り方が異なる

Hash#map は渡したブロックの引数の数によって受け取り方が異なります。 homu = { name: :homu, age: 14 } # 引数が2つの場合はキーと値が別々に渡される homu.map { |key, value| "#{key} : #{value}" } # => ["name : homu", "age : 14"] # 引数が1つの場…

MacBook Air を触ってみた所感

まだ全然触れてないのでハード面の所感。 薄いので蓋が開けづらい 電源コードが太い トラックパッドがむずい キーボードがUS配列 薄い MBA には何回か触ってみたことはあるんですがやっぱり薄いですね。あと軽い。 ただ、薄さを重視している成果ディスプレイ…

Ruby の Array#* は Array#join と同等

知らなかった。 data = ["homu", "mami", "mado"] data * " + " # => "homu + mami + mado" 便利そうではあるのだけれど多用するのはなんか微妙な気もする。

某氏から MacBook Air を譲ってもらった

もう使ってないということで某氏から MacBook Air を譲ってもらいました!!ありがとうございます!! これで MacVim 勢の仲間入りです なお、US配列で無事死亡した模様。

Ruby で動的にメソッドを定義する

Ruby で動的にメソッドを定義したい場合、#define_method を利用する事ができます。 def create_method name define_method name do name end end create_method "homu" create_method "mami" homu # => "homu" mami # => "mami" Ruby でメタプログラミング…

Ruby でスペースや記号が含まれている名前でメソッドを定義する

Ruby でメソッドを定義する場合、名前には識別子(英数字+`)と再定義可能な演算子のみ使用する事ができます。 しかし、define_method` メソッドを使用するとスペースや記号を含んだ名前のメソッドを定義する事ができます。 class X # #define_method を使用し…

C++11 以降で using を使って配列型を別名で定義

C++

Twitter でみかけたんですが、こういう使い方もできるんだなーと。 C++03 では以下のように typedef を使って配列型を別名で定義することができます。 // int[5] の配列を int5 という名前で定義 typedef int int5[5]; int5 members = {0, 1, 2, 3, 4}; 関数…

Ruby でメソッド名から Proc オブジェクトを生成する

#method を使うとレシーバのメソッドを Proc オブジェクトとして生成する事ができます。 class X def class_name "class X" end end x = X.new # メソッド名を渡すとそのメソッドを呼び出す Proc オブジェクトを返す class_name = x.method :class_name clas…

Ruby で可変長引数の Proc オブジェクトをカリー化する

可変長引数を受け取る Proc オブジェクトをカリー化する場合、#curry メソッドに対して任意の引数数を指定する事ができます。 sum = proc { |*args| args.inject :+ } # #curry に対して引数の数を渡す # 引数を2つ受け取ったら評価する p sum.curry(2).(1).…