Feature #9783 » 0001-Implement-Method-curry-which-delegates-to-to_proc.cu.patch
| proc.c | ||
|---|---|---|
|     return rb_method_call_with_block(argc, argv, method, proc); | ||
| } | ||
| /* | ||
|  *  call-seq: | ||
|  *     meth.curry        -> proc | ||
|  *     meth.curry(arity) -> proc | ||
|  * | ||
|  *  Returns a curried proc based on the method. When the proc is called with a number of | ||
|  *  arguments that is lower than the method's arity, then another curried proc is returned. | ||
|  *  Only when enough arguments have been supplied to satisfy the method signature, will the | ||
|  *  method actually be called. | ||
|  * | ||
|  *  The optional <i>arity</i> argument should be supplied when currying methods with | ||
|  *  variable arguments to determine how many arguments are needed before the method is | ||
|  *  called. | ||
|  * | ||
|  *     def foo(a,b,c) | ||
|  *       [a, b, c] | ||
|  *     end | ||
|  * | ||
|  *     proc  = self.method(:foo).curry | ||
|  *     proc2 = proc.call(1, 2)          #=> #<Proc> | ||
|  *     proc2.call(3)                    #=> [1,2,3] | ||
|  * | ||
|  *     def vararg(*args) | ||
|  *       args | ||
|  *     end | ||
|  * | ||
|  *     proc = self.method(:vararg).curry(4) | ||
|  *     proc2 = proc.call(:x)      #=> #<Proc> | ||
|  *     proc3 = proc2.call(:y, :z) #=> #<Proc> | ||
|  *     proc3.call(:a)             #=> [:x, :y, :z, :a] | ||
|  */ | ||
| VALUE | ||
| rb_method_curry(int argc, VALUE *argv, VALUE self) | ||
| { | ||
|     VALUE proc = rb_funcall(self, rb_intern("to_proc"), 0); | ||
|     return rb_funcall2(proc, rb_intern("curry"), argc, argv); | ||
| } | ||
| VALUE | ||
| rb_method_call_with_block(int argc, VALUE *argv, VALUE method, VALUE pass_procval) | ||
| { | ||
| ... | ... | |
|     rb_define_method(rb_cMethod, "hash", method_hash, 0); | ||
|     rb_define_method(rb_cMethod, "clone", method_clone, 0); | ||
|     rb_define_method(rb_cMethod, "call", rb_method_call, -1); | ||
|     rb_define_method(rb_cMethod, "curry", rb_method_curry, -1); | ||
|     rb_define_method(rb_cMethod, "[]", rb_method_call, -1); | ||
|     rb_define_method(rb_cMethod, "arity", method_arity_m, 0); | ||
|     rb_define_method(rb_cMethod, "inspect", method_inspect, 0); | ||
| test/ruby/test_method.rb | ||
|---|---|---|
|     m = assert_nothing_raised(NameError, feature8391) {break o.singleton_method(:bar)} | ||
|     assert_equal(:bar, m.call, feature8391) | ||
|   end | ||
|   def test_curry | ||
|     c = Class.new | ||
|     p = proc {|a,b,c| a + b + c } | ||
|     c.class_eval { define_method(:three_args, p) } | ||
|     curried = c.new.method(:three_args).curry | ||
|     assert_equal(6, curried.(1).(2).(3)) | ||
|   end | ||
|   def test_curry_arity | ||
|     c = Class.new | ||
|     p = proc {|*args| args } | ||
|     c.class_eval { define_method(:var_args, p) } | ||
|     curried = c.new.method(:var_args).curry(3) | ||
|     assert_equal([1, 2, 3], curried.(1).(2).(3)) | ||
|   end | ||
| end | ||
- « Previous
- 1
- 2
- Next »