Feature #4146

Improvement of Symbol and Proc

Added by Nobuyoshi Nakada over 3 years ago. Updated over 1 year ago.

[ruby-dev:42733]
Status:Rejected
Priority:Normal
Assignee:Nobuyoshi Nakada
Category:core
Target version:-

Description

=begin
現在Symbol#toprocで %w[12 45 32].map(&:toi) のようなことはできますが、
引数を付けてメソッドを呼ぶことはできません。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

History

#1 Updated by Yukihiro Matsumoto over 3 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#toprocで %w[12 45 32].map(&:toi) のようなことはできますが、
|引数を付けてメソッドを呼ぶことはできません。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 3 years ago

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

現在Symbol#toprocで %w[12 45 32].map(&:toi) のようなことはできますが、
引数を付けてメソッドを呼ぶことはできません。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 methodmissing 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(&.toi(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 2 years ago

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

#4 Updated by Ilya Vorontsov almost 2 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(&:tos.(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 curryexceptself(*args, &block)
Proc.new{|slf| curry.call(slf, *args, &block) }
end
end

class Symbol
def call(args, &block)
obj=Object.new.instanceexec(self,args,block) do |sym,params,block|
@sym=sym
@args = params
@block = block
self
end
obj.define
singletonmethod :toproc do
@sym.toproc.curryexcept_self(
@args, &@block)
end
obj
end
end

#5 Updated by Koichi Sasada almost 2 years ago

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

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

#6 Updated by Koichi Sasada over 1 year ago

  • Assignee changed from Koichi Sasada to Nobuyoshi Nakada

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

#7 Updated by Yukihiro Matsumoto over 1 year ago

  • Status changed from Assigned to Rejected

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

Matz.

Also available in: Atom PDF