Proc に2項演算子を定義してみた

class Proc

    %w[ + - * / ** % | & ^ > < >= <= == <=> >> << =~ != !~ ].map{|i| i.to_sym }.each do |op|
        define_method(op) do |rhs|
            apply_binary(rhs,&op)
        end
    end

    private

    def apply_binary rhs
        raise "block is needed" unless block_given?
        Proc.new{|*args| yield self.call(*args),rhs.call(*args) }
    end

end

これにより,Proc クラスのオブジェクト a, b に対して,a + b とすると a と b をそれぞれ呼び出した後に演算子を適用する Proc オブジェクトを新たに生成できます.
自分で言っていてよく分からないので具体例を.

a = lambda{|i| i * 3 }
b = lambda{|i| i / 2 }

# これは c = lambda{|i| i*3 + i/2 } と同じ
c = a + b

c.call 4 #=> 14

こんな感じになります.