[#44036] [ruby-trunk - Feature #6242][Open] Ruby should support lists — "shugo (Shugo Maeda)" <redmine@...>

20 messages 2012/04/01

[#44084] [ruby-trunk - Bug #6246][Open] 1.9.3-p125 intermittent segfault — "jshow (Jodi Showers)" <jodi@...>

22 messages 2012/04/02

[#44156] [ruby-trunk - Feature #6265][Open] Remove 'useless' 'concatenation' syntax — "rosenfeld (Rodrigo Rosenfeld Rosas)" <rr.rosas@...>

45 messages 2012/04/06

[#44163] [ruby-trunk - Bug #6266][Open] encoding related exception with recent integrated psych — "jonforums (Jon Forums)" <redmine@...>

10 messages 2012/04/06

[#44303] [ruby-trunk - Feature #6284][Open] Add composition for procs — "pabloh (Pablo Herrero)" <pablodherrero@...>

57 messages 2012/04/12

[#44349] [ruby-trunk - Feature #6293][Open] new queue / blocking queues — "tenderlovemaking (Aaron Patterson)" <aaron@...>

10 messages 2012/04/13

[#44402] [ruby-trunk - Feature #6308][Open] Eliminate delegation from WeakRef — "headius (Charles Nutter)" <headius@...>

20 messages 2012/04/17

[#44403] [ruby-trunk - Feature #6309][Open] Add a reference queue for weak references — "headius (Charles Nutter)" <headius@...>

15 messages 2012/04/17

[#44533] [ruby-trunk - Bug #6341][Open] SIGSEGV: Thread.new { fork { GC.start } }.join — "rudolf (r stu3)" <redmine@...>

24 messages 2012/04/22

[#44630] [ruby-trunk - Feature #6361][Open] Bitwise string operations — "MartinBosslet (Martin Bosslet)" <Martin.Bosslet@...>

31 messages 2012/04/26

[#44648] [ruby-trunk - Feature #6367][Open] #same? for Enumerable — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

16 messages 2012/04/26

[#44704] [ruby-trunk - Feature #6373][Open] public #self — "trans (Thomas Sawyer)" <transfire@...>

61 messages 2012/04/27

[#44748] [ruby-trunk - Feature #6376][Open] Feature lookup and checking if feature is loaded — "trans (Thomas Sawyer)" <transfire@...>

13 messages 2012/04/28

[ruby-core:44122] [ruby-trunk - Feature #6253][Open] Implement a way to pass keyword options to curried procs

From: "jballanc (Joshua Ballanco)" <jballanc@...>
Date: 2012-04-04 05:27:11 UTC
List: ruby-core #44122
Issue #6253 has been reported by jballanc (Joshua Ballanco).

----------------------------------------
Feature #6253: Implement a way to pass keyword options to curried procs
https://bugs.ruby-lang.org/issues/6253

Author: jballanc (Joshua Ballanco)
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: 2.0.0


=begin
(See original discussion in issue #4610)

With the introduction of keyword arguments in Ruby 2.0, it would be useful to have a way to set a keyword-based option on a curried proc. The example below demonstrates a Rack-like system where a curried proc is passed to a helper, then after partial application of the arguments, the returned curried proc is stored and later evaluated:

    class NicknameTranslator
      def initialize(app)
        @app = app
      end
    
      def call(name)
        case name
        when 'Robert'
          @app.call('Bob')
        when 'James'
          @app.call('Jimmy')
        else
          @app.call(name)
        end
      end
    end
    
    class NightGreeting
      def initialize(app)
        @app = app
        @app.pass_option(greeting: 'Goodnight')
      end
    
      def call(name)
        @app.call(name)
      end
    end
    
    class Greeter
      def initialize(helper)
        @helper = helper
        @app = lambda do |sender, receiver, greeting: 'Hello'|
          puts "#{sender} says \"#{greeting}\" to #{receiver}"
        end.curry
        @greetings = {}
      end
    
      def call(sender, receiver)
        @greetings[sender] ||= @helper.new(@app).call(sender)
        @greetings[sender].call(receiver)
      end
    end
    
    Greeter.new(NicknameTranslator).call('Josh', 'Joe')
    Greeter.new(NicknameTranslator).call('Robert', 'Joe')
    Greeter.new(NicknameTranslator).call('Josh', 'Robert')

If we wanted, however, to be able to set a keyword-based option in the helper, there is currently no way in Ruby 2.0 to do so. Currently, keyword arguments can only be used at the same time as the final non-keyword, non-default, non-rest argument to the proc is applied. So, for example, there is no way to do the above with NightGreeting in place of NicknameTranslator.

Currying is really only useful when it can be used with partial application. However, Ruby currently limits how you can achieve partial application of curried procs. In particular, there is no way to manage partial application of parameters with default values. As such, it is not surprising that Proc#curry does not seem to have been adopted very widely. In my personal survey of ~600 gems that I use in various projects, I did not find any usage of Proc#curry.

So, I would request a method like Proc#pass_option (or some other, better name) that allows for setting keyword arguments on a curried proc at any time.
=end



-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next