facets icon indicating copy to clipboard operation
facets copied to clipboard

Proc#compose ArgumentError incorrect

Open domgetter opened this issue 8 years ago • 1 comments

Proc#compose raises an error when it shouldn't. The following two lambdas can compose:

make_twin = -> n { return n, n }
take_twin = -> n, m { puts n; puts m }
twin_comp = -> n { take_twin[*make_twin[n]] }

twin_comp[2]
2
2
=> nil

But with Proc#compose, it raises an ArgumentError:

take_twin.compose(make_twin)
ArgumentError: arity count mismatch

One solution is to wrap the inner call in a begin:

class Proc
  def compose(g)
    lambda do |*a|
      begin
        self[ *g[*a] ]
      rescue ArgumentError => e
        puts "#{e.class}: #{e.message}" # or whatever message is appropriate
        puts e.backtrace
      end
    end
  end
end

There's not really a way to check a proc's return arity at runtime, since it can return in more than one way.

domgetter avatar Dec 22 '15 08:12 domgetter

Hmm... good point. Perhaps we can just get rid to the argument error condition altogether?

def compose(g)
  lambda{ |*a| self[ *g[*a] ] }
end

trans avatar Jan 09 '16 17:01 trans