Haskell では,関数を中置する文法が用意されています.
5 `mod` 2 -- 1
[1,2,3] `isPrefixOf` [1,2,3,4] -- True
Ruby でも関数をうまく中置できないか考えました.
かなりネタですが,次のようにするとそれっぽくなります.`` 不要です.
# 右辺の値を受け取って,左辺の値を受け取り結果を返すメソッドを定義
def is_prefix_of(rhs)
lambda do |lhs|
lhs.zip(rhs).reject{|a,b| a.nil?}.all?{|a,b| a==b}
end
end
def elem(rhs)
lambda{|lhs| rhs.include? lhs}
end
a1 = 1,2,3
a2 = 1,2,3,4,5,6
n = 10
# a1 を知るためにブロックで外の変数を取り込む
self.define_singleton_method(:method_missing) do |name,*args|
args.first.call eval name.to_s
end
# is_prefix_of を中置!
a1 is_prefix_of a2 #=> true
# 左辺が右辺に含まれているかを示す elem も中置!
n elem [2,4,6,8] #=> false
これはまず is_prefix_of a2
で a2
だけを部分適用した Proc
オブジェクトが返され,a1
が呼ばれて,a1
は実際には存在しないメソッドなので method_missing
に呼び出しが渡され,そこで実際の処理が行われるという流れです.
method_missing
の定義内で a1
を知っていないといけないのと,そもそもリテラルが左辺に来てはいけないので実用性は無いですが,中置格好良いです.