Feature #4146
closedImprovement of Symbol and Proc
Added by nobu (Nobuyoshi Nakada) almost 14 years ago. Updated over 8 years ago.
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"]
Files
symbol_lambda.diff (5.39 KB) symbol_lambda.diff | nobu (Nobuyoshi Nakada), 12/10/2010 08:02 PM |
Updated by matz (Yukihiro Matsumoto) almost 14 years ago
まつもと ゆきひろです
In message "Re: [ruby-dev:42733] [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
などを組み合わせると
似たようなものが作れそうですし。
Updated by ko1 (Koichi Sasada) almost 14 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
Updated by nahi (Hiroshi Nakamura) over 12 years ago
- Description updated (diff)
- Status changed from Open to Assigned
- Assignee set to ko1 (Koichi Sasada)
Updated by prijutme4ty (Ilya Vorontsov) over 12 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
Updated by ko1 (Koichi Sasada) over 12 years ago
これ,なんで私なんだっけ.
まつもとさんが最初に気に入らない,と言っているところですが,
今見直してみるとどうでしょうか.
Updated by ko1 (Koichi Sasada) about 12 years ago
- Assignee changed from ko1 (Koichi Sasada) to nobu (Nobuyoshi Nakada)
進んでないので,中田さん,どうぞよろしく.
Updated by matz (Yukihiro Matsumoto) about 12 years ago
- Status changed from Assigned to Rejected
文法が気に入らないのでreject。
Matz.
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Related to Feature #8987: map/collect extension which handles arguments added
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Related to Feature #9076: New one-argument block syntax: &. added
Updated by nobu (Nobuyoshi Nakada) over 8 years ago
- Related to Feature #12115: Add Symbol#call to allow to_proc shorthand with arguments added
Updated by nobu (Nobuyoshi Nakada) over 8 years ago
- Description updated (diff)