Project

General

Profile

Feature #4146

Improvement of Symbol and Proc

Added by Nobuyoshi Nakada over 5 years ago. Updated 2 months ago.

Status:
Rejected
Priority:
Normal
[ruby-dev:42733]

Description

現在Symbol#to_proc%w[12 45 32].map(&:to_i) のようなことはできますが、
引数を付けてメソッドを呼ぶことはできません。Symbolリテラルに引数を付け
たらその引数と共にメソッドを呼ぶProcを作る構文というのはどうでしょうか。

%w[12 45 32].map(&:to_i(9)).map(&:*(2)) #=> [22, 82, 58]
%w[abc def ghi].map(&:[1])              #=> ["b", "e", "h"]

symbol_lambda.diff Magnifier (5.39 KB) Nobuyoshi Nakada, 12/10/2010 08:02 PM


Related issues

Related to Ruby trunk - Feature #6483: parametric map Rejected 05/22/2012
Related to Ruby trunk - Feature #8987: map/collect extension which handles arguments Open 10/05/2013
Related to Ruby trunk - Feature #9076: New one-argument block syntax: &. Feedback 11/04/2013
Related to Ruby trunk - Feature #12115: Add Symbol#call to allow to_proc shorthand with arguments Open

History

#1 Updated by Yukihiro Matsumoto over 5 years ago

まつもと ゆきひろです

In message "Re: [Ruby 1.9-Feature#4146][Open] Improvement of Symbol and Proc"
on Fri, 10 Dec 2010 20:04:05 +0900, Nobuyoshi Nakada redmine@ruby-lang.org writes:

Feature #4146: Improvement of Symbol and Proc
http://redmine.ruby-lang.org/issues/show/4146

現在Symbol#to_proc%w[12 45 32].map(&:to_i) のようなことはできますが、
引数を付けてメソッドを呼ぶことはできません。Symbolリテラルに引数を付け
たらその引数と共にメソッドを呼ぶProcを作る構文というのはどうでしょうか。

%w[12 45 32].map(&:to_i(9)).map(&:*(2)) #=> [22, 82, 58]
%w[abc def ghi].map(&:[1])              #=> ["b", "e", "h"]

うーん、あまり賛成はしません。構文が複雑になる割に得られるメ
リットが限定的だからです。method_missingなどを組み合わせると
似たようなものが作れそうですし。

#2 Updated by Koichi Sasada over 5 years ago

(2010/12/10 20:04), Nobuyoshi Nakada wrote:

現在Symbol#to_procで %w[12 45 32].map(&:to_i) のようなことはできますが、
引数を付けてメソッドを呼ぶことはできません。Symbolリテラルに引数を付け
たらその引数と共にメソッドを呼ぶProcを作る構文というのはどうでしょうか。

%w[12 45 32].map(&:to_i(9)).map(&:*(2)) #=> [22, 82, 58]
%w[abc def ghi].map(&:[1])              #=> ["b", "e", "h"]

 メソッドだと,やっぱり書くのがめんどいっすかね?

class Symbol
  def with *args
    lambda{|recv|
      recv.__send__(self, *args)
    }
  end
end

p %w[12 45 32].map(&:to_i.with(9)).map(&:*.with(2))
p %w[abc def ghi].map(&:[].with(1))

 こういうのも curry 化の一種と言えるんだろうか?

 method_missing を使うのはこんな感じでしょうか.

class ProcMaker
  def method_missing sym, *args
    lambda{|recv|
      recv.__send__ sym, *args
    }
  end
end

PM = ProcMaker.new

p %w[12 45 32].map(&PM.to_i(9)).map(&PM * 2)
p %w[abc def ghi].map(&PM[1])

 新しい文法を考えるのなら,& に対するメソッド呼び出しを,Proc 生成へ変
換するってのはあるかもしれない.

p %w[12 45 32].map(&.to_i(9)).map(& * 2)
p %w[abc def ghi].map(&[1])
#=>
p %w[12 45 32].map(&lambda{|recv| recv.to_i(9)}).map(&lambda{|recv| recv
* 2})
p %w[abc def ghi].map(&lambda{|recv| recv[1]})

--
// SASADA Koichi at atdot dot net

#3 [ruby-dev:45394] Updated by Hiroshi Nakamura about 4 years ago

  • Assignee set to Koichi Sasada
  • Status changed from Open to Assigned
  • Description updated (diff)

#4 [ruby-dev:45701] Updated by Ilya Vorontsov almost 4 years ago

I also propose to consider recursive application for a method in a style I've written in http://bugs.ruby-lang.org/issues/6483#note-3:

Usual application:

(1..5).map(&:to_s.(2)) # => ['1', '10', '11', '100', '101']
Recursive application:
[[1,2,3],[4,5,6]].map(&:map.(&:to_s)) # => [['1','2','3'],['4','5','6']]
[[1,2,3],[4,5,6]].map(&:map.(&:to_s.(2))) # => [['1','10','11'],['100','101','110']]

All of this can be done with a bit of ruby code:

class Proc
  def curry_except_self(*args, &block)
    Proc.new{|slf| curry.call(slf, *args, &block) }
  end
end

class Symbol
  def call(*args, &block)
    obj=Object.new.instance_exec(self,args,block) do |sym,params,block| 
      @sym=sym
      @args = params
      @block = block
      self
    end
    obj.define_singleton_method :to_proc do
      @sym.to_proc.curry_except_self(*@args, &@block)
    end
    obj
  end
end

#5 [ruby-dev:45842] Updated by Koichi Sasada almost 4 years ago

これ,なんで私なんだっけ.

まつもとさんが最初に気に入らない,と言っているところですが,
今見直してみるとどうでしょうか.

#6 [ruby-dev:46312] Updated by Koichi Sasada over 3 years ago

  • Assignee changed from Koichi Sasada to Nobuyoshi Nakada

進んでないので,中田さん,どうぞよろしく.

#7 [ruby-dev:46313] Updated by Yukihiro Matsumoto over 3 years ago

  • Status changed from Assigned to Rejected

文法が気に入らないのでreject。

Matz.

#8 [ruby-dev:48280] Updated by Nobuyoshi Nakada almost 2 years ago

  • Related to Feature #8987: map/collect extension which handles arguments added

#9 [ruby-dev:48281] Updated by Nobuyoshi Nakada almost 2 years ago

  • Related to Feature #9076: New one-argument block syntax: &. added

#10 Updated by Nobuyoshi Nakada 2 months ago

  • Related to Feature #12115: Add Symbol#call to allow to_proc shorthand with arguments added

#11 [ruby-dev:49504] Updated by Nobuyoshi Nakada 2 months ago

  • Description updated (diff)

Also available in: Atom PDF