2015-08-01から1ヶ月間の記事一覧
いつの間にか 3.7 がリリースされていました。 リリースノートは以下の通り LLVM 3.7 Release Notes LLVM 3.7 documentation
その昔に書いたコードを発掘したので載せてみるなど。 このコードは 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<基底クラス> への 暗黙的な変換はできません。 struct base{ }; struct derived : base{ }; std::vector<derived*> ary; // base は derived の基底クラスなので変換を期待するが、こういう変換は</derived*>…
std::vector<T&> みたいに std::vector で参照値を保持したい事があると思いますが、これはコンパイルエラーになってしまいます。 この問題を回避したい場合は、C++11 で追加された std::reference_wrapper を利用する事ができます。 [コード] #include <vector> #includ</vector></t&>…
std::reference_wrapper<T> は std::ref() 等で返ってくるクラスなんですが、参照元に T 型の値を代入するときにちょっと気になったので覚書。 さて、次のように std::reference_wrapper<int> で保持している参照元に対して整数を代入する場合、コンパイルエラーにな</int></t>…
どういうことかというと大文字から始まる変数名と小文字から始まる変数名では #class で返ってくる値が違いました。 X = Class.new X.new.class # => X x = Class.new x.new.class # => #<Class:0x000000016871c0> Ruby キモい(確信</class:0x000000016871c0>
元々は本体に要望していた機能だったんですが、最近簡単に定義できる方法を思いついたので書いておきます。 概要としては、デフォルトアクションとは別に source で共通したキーマッピングのアクションがほしいというものでした。 (<Leader><CR> を入力した時に source-f</cr></leader>…
今まで知らなかったので覚書。 C++ では void* 型から他のポインタ型へ暗黙的に変換することはできない。 なので、次のようなコードはエラーになる。 void* vp; // error: cannot initialize a variable of type 'int *' with an lvalue of type 'void *'; i…
Ruby では class や module 定義も式なので戻り値があります。 class や module の定義式の戻り値は『最後に評価した式の結果』になります。 # 最後に評価式を返す # この場合は最後に定義したメソッドの戻り値を返す result = class X def method1 end def …
Ruby ではメソッドの定義(def)も式なので戻り値があります。 # メソッド定義の戻り値はメソッド名の Symbol name = def plus a, b a + b end p name # => :plus これって何かに利用できるのだろうか。 [おまけ] 式なので当然、以下のようなコードを記述す…
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…
これを簡単に書けるようにしてみたくて書いてみた。 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…
意図としては以下のように block 内で呼び出したレシーバを参照したい。 [1, 2, 3].map { |it| it + self.size # block 内でレシーバのオブジェクトを参照したい } # => [4, 5, 6] しかし、block 内のスコープでメソッドやオブジェクトを参照した場合、定義…
さて、テンプレート引数には int 型等の整数値を直接渡すことはできますが、float 値を直接渡すことはできません。 // こういう風に float 値を受け取ることはできない template<float F> struct X{ ... }; こういう場合、std::ratio みたいに分子と分母に分けて整数</float>…
他人の書いた C/C++ のコードを見ているとあまりにも予約済み識別子を無視してコードを書いているものが多いので、ついカッとなってつくった。 プラグイン osyo-manga/vim-cpp-syntax-reserved_identifiers NeoBundle 'osyo-manga/vim-cpp-syntax-reserved_i…
元々スマホではケータイ配列でフリック入力を使っていたんですが、最近どうにも Google 日本語入力が重すぎてレスポンスがめちゃくちゃ悪い(特に濁点の入力が半分ぐらいの確率で入力されない)ので Godan という入力方法を試してみました。 Godan について…
Enumerable#each_with_index を利用すると index を付属してループする事ができます。 ["homu", "mami", "mado"].each_with_index { |it, i| puts "#{i} : #{it}" } # => 0 : homu # 1 : mami # 2 : mado index の初期値を指定してループする index の初期値…
例えば、次のように空白を挟んだ文字列リテラルを連続で記述した場合、それは1つの文字列として結合されます。 # 空白を挟んで定義すると1つの文字列として結合される s = "homu" "mami" "mado" # => "homumamimado" # こういう風に書いても結合される ss = …
Enumerable#each_with_index の実装がどうなっているのか知りたかったんですが、どうやら C で書かれているようなので自分で Ruby を使った実装を書いてみた。 module Enumerable def each_with_index2 &block if block_given? index = 0 each { |it| block.…
Hash#map の引数の受け取り方で悩んでたんですが、つまりこういう事か。 # ブロックに配列を渡す def test &block block.call [1, 2, 3] end # 引数がひとつだけの場合はそのまま配列になる test { |a| p a # => [1, 2, 3] } # 配列の要素数よりも引数が少な…
さて、iolite を利用するとブロックを抽象的に記述する事ができるのですが、Hash#map に渡すときに注意する必要があります。 例えば、 homu = { "name" => "homu", "age" => "14"} # これを iolite を使って抽象化したい homu.map { |key, value| key + " : …
Hash#map は渡したブロックの引数の数によって受け取り方が異なります。 homu = { name: :homu, age: 14 } # 引数が2つの場合はキーと値が別々に渡される homu.map { |key, value| "#{key} : #{value}" } # => ["name : homu", "age : 14"] # 引数が1つの場…
まだ全然触れてないのでハード面の所感。 薄いので蓋が開けづらい 電源コードが太い トラックパッドがむずい キーボードがUS配列 薄い MBA には何回か触ってみたことはあるんですがやっぱり薄いですね。あと軽い。 ただ、薄さを重視している成果ディスプレイ…
知らなかった。 data = ["homu", "mami", "mado"] data * " + " # => "homu + mami + mado" 便利そうではあるのだけれど多用するのはなんか微妙な気もする。
もう使ってないということで某氏から MacBook Air を譲ってもらいました!!ありがとうございます!! これで MacVim 勢の仲間入りです なお、US配列で無事死亡した模様。
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 でメソッドを定義する場合、名前には識別子(英数字+`)と再定義可能な演算子のみ使用する事ができます。 しかし、define_method` メソッドを使用するとスペースや記号を含んだ名前のメソッドを定義する事ができます。 class X # #define_method を使用し…
Twitter でみかけたんですが、こういう使い方もできるんだなーと。 C++03 では以下のように typedef を使って配列型を別名で定義することができます。 // int[5] の配列を int5 という名前で定義 typedef int int5[5]; int5 members = {0, 1, 2, 3, 4}; 関数…
#method を使うとレシーバのメソッドを Proc オブジェクトとして生成する事ができます。 class X def class_name "class X" end end x = X.new # メソッド名を渡すとそのメソッドを呼び出す Proc オブジェクトを返す class_name = x.method :class_name clas…
可変長引数を受け取る Proc オブジェクトをカリー化する場合、#curry メソッドに対して任意の引数数を指定する事ができます。 sum = proc { |*args| args.inject :+ } # #curry に対して引数の数を渡す # 引数を2つ受け取ったら評価する p sum.curry(2).(1).…