names=curry
visibility=public
kind=defined

--- curry         -> Proc
--- curry(arity)  -> Proc
Procをカリー化します

カリー化したProcはいくつかの引数をとります。十分な数の引数が与えられると、元のProcに引数を渡し
て実行し、結果を返します。引数の個数が足りないときは、部分適用したカリー化Procを返します。

@param arity 引数の個数を指定します
@return カリー化したProcオブジェクトを返します

  b = proc {|x, y, z| (x||0) + (y||0) + (z||0) }
  p b.curry[1][2][3]           #=> 6
  p b.curry[1, 2][3, 4]        #=> 6
  p b.curry(5)[1][2][3][4][5]  #=> 6
  p b.curry(5)[1, 2][3, 4][5]  #=> 6
  p b.curry(1)[1]              #=> 1

  b = proc {|x, y, z, *w| (x||0) + (y||0) + (z||0) + w.inject(0, &:+) }
  p b.curry[1][2][3]           #=> 6
  p b.curry[1, 2][3, 4]        #=> 10
  p b.curry(5)[1][2][3][4][5]  #=> 15
  p b.curry(5)[1, 2][3, 4][5]  #=> 15
  p b.curry(1)[1]              #=> 1

  b = lambda {|x, y, z| (x||0) + (y||0) + (z||0) }
  p b.curry[1][2][3]           #=> 6
  p b.curry[1, 2][3, 4]        #=> wrong number of arguments (4 or 3)
  p b.curry(5)                 #=> wrong number of arguments (5 or 3)
  p b.curry(1)                 #=> wrong number of arguments (1 or 3)

  b = lambda {|x, y, z, *w| (x||0) + (y||0) + (z||0) + w.inject(0, &:+) }
  p b.curry[1][2][3]           #=> 6
  p b.curry[1, 2][3, 4]        #=> 10
  p b.curry(5)[1][2][3][4][5]  #=> 15
  p b.curry(5)[1, 2][3, 4][5]  #=> 15
  p b.curry(1)                 #=> wrong number of arguments (1 or 3)

  b = proc { :foo }
  p b.curry[]                  #=> :foo

