Feature #4146

Improvement of Symbol and Proc

Added by Nobuyoshi Nakada over 4 years ago. Updated over 2 years ago.

[ruby-dev:42733]
Status:Rejected
Priority:Normal
Assignee:Nobuyoshi Nakada

Description

=begin
現在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"]
=end

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

History

#1 Updated by Yukihiro Matsumoto over 4 years ago

=begin
まつもと ゆきひろです

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などを組み合わせると
似たようなものが作れそうですし。

=end

#2 Updated by Koichi Sasada over 4 years ago

=begin
(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

=end

#3 Updated by Hiroshi Nakamura about 3 years ago

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

#4 Updated by Ilya Vorontsov almost 3 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 Updated by Koichi Sasada almost 3 years ago

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

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

#6 Updated by Koichi Sasada over 2 years ago

  • Assignee changed from Koichi Sasada to Nobuyoshi Nakada

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

#7 Updated by Yukihiro Matsumoto over 2 years ago

  • Status changed from Assigned to Rejected

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

Matz.

#8 Updated by Nobuyoshi Nakada 12 months ago

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

#9 Updated by Nobuyoshi Nakada 12 months ago

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

Also available in: Atom PDF