Project

General

Profile

Actions

Feature #4146

closed

Improvement of Symbol and Proc

Added by nobu (Nobuyoshi Nakada) about 14 years ago. Updated almost 9 years ago.

Status:
Rejected
Target version:
-
[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"]

Files

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

Related issues 4 (2 open2 closed)

Related to Ruby master - Feature #6483: parametric mapRejectedmatz (Yukihiro Matsumoto)05/22/2012Actions
Related to Ruby master - Feature #8987: map/collect extension which handles argumentsOpenActions
Related to Ruby master - Feature #9076: New one-argument block syntax: &.FeedbackActions
Related to Ruby master - Feature #12115: Add Symbol#call to allow to_proc shorthand with argumentsOpenActions
Actions #1

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

Actions #2

Updated by ko1 (Koichi Sasada) about 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) almost 13 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
Actions #10

Updated by nobu (Nobuyoshi Nakada) almost 9 years ago

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

Updated by nobu (Nobuyoshi Nakada) almost 9 years ago

  • Description updated (diff)
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0