[#6143] — Christophe Poucet <christophe.poucet@...>

Hello,

17 messages 2005/10/04
[#6147] Re: patch.tgz — nobu.nokada@... 2005/10/04

Hi,

[#6199] Kernel rdoc HTML file not being created when rdoc is run on 1.8.3 — James Britt <ruby@...>

When 1.8.3 came out, I grabbed the source and ran rdoc on it. After

9 messages 2005/10/08

[#6251] RubyGems, upstream releases and idempotence of packaging — Mauricio Fern疣dez <mfp@...>

[sorry for the very late reply; I left this message in +postponed and forgot

14 messages 2005/10/12

[#6282] Wilderness: Need Code to invoke ELTS_SHARED response — "Charles E. Thornton" <ruby-core@...>

Testing the My Object Dump and I am trying to cause creation

13 messages 2005/10/14
[#6283] Re: Wilderness: Need Code to invoke ELTS_SHARED response — Mauricio Fern疣dez <mfp@...> 2005/10/14

On Fri, Oct 14, 2005 at 05:04:59PM +0900, Charles E. Thornton wrote:

[#6288] Re: Wilderness: Need Code to invoke ELTS_SHARED response — "Charles E. Thornton" <ruby-core@...> 2005/10/14

Mauricio Fern疣dez wrote:

[#6365] Time for built-in Rational and Complex classes? — Gavin Sinclair <gsinclair@...>

There has been some support for, but no comment on, RCR #260 ("Make

12 messages 2005/10/24
[#6366] Re: Time for built-in Rational and Complex classes? — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/24

On Mon, 24 Oct 2005, Gavin Sinclair wrote:

[#6405] Re: [PATCH] Pathname.exists?() — "Berger, Daniel" <Daniel.Berger@...>

12 messages 2005/10/25
[#6406] Re: [PATCH] Pathname.exists?() — TRANS <transfire@...> 2005/10/25

On 10/25/05, Berger, Daniel <Daniel.Berger@qwest.com> wrote:

[#6408] Re: [PATCH] Pathname.exists?() — Gavin Sinclair <gsinclair@...> 2005/10/25

On 10/26/05, TRANS <transfire@gmail.com> wrote:

[#6442] Wilderness: I Have formatted README.EXT into an HTML Document — "Charles E. Thornton" <ruby-core@...>

I have taken README.EXT (English Version Only) and have reformatted

14 messages 2005/10/27

[#6469] csv.rb a start on refactoring. — Hugh Sasse <hgs@...>

For a database application I found using CSV to be rather slow.

50 messages 2005/10/28
[#6470] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/28

[#6471] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/28

On Oct 28, 2005, at 8:53 AM, Ara.T.Howard wrote:

[#6474] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/28

On Fri, 28 Oct 2005, James Edward Gray II wrote:

[#6484] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/29

On Oct 28, 2005, at 9:58 AM, Ara.T.Howard wrote:

[#6485] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/29

On Sat, 29 Oct 2005, James Edward Gray II wrote:

[#6486] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/29

On Oct 28, 2005, at 8:25 PM, Ara.T.Howard wrote:

[#6487] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/29

On Sat, 29 Oct 2005, James Edward Gray II wrote:

[#6491] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/29

On Oct 28, 2005, at 8:43 PM, Ara.T.Howard wrote:

[#6493] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/29

On Oct 28, 2005, at 10:06 PM, James Edward Gray II wrote:

[#6496] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/29

On Sun, 30 Oct 2005, James Edward Gray II wrote:

[#6502] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/30

On Oct 29, 2005, at 12:11 PM, Ara.T.Howard wrote:

[#6505] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/30

On Mon, 31 Oct 2005, James Edward Gray II wrote:

[#6511] Planning FasterCSV (was Re: csv.rb a start on refactoring.) — James Edward Gray II <james@...> 2005/10/30

I've decided to create a FasterCSV library, based on the code we

[#6516] Re: Planning FasterCSV (was Re: csv.rb a start on refactoring.) — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/31

On Mon, 31 Oct 2005, James Edward Gray II wrote:

[#6518] Re: Planning FasterCSV (was Re: csv.rb a start on refactoring.) — "NAKAMURA, Hiroshi" <nakahiro@...> 2005/10/31

-----BEGIN PGP SIGNED MESSAGE-----

Re: yield and call not identical?

From: TRANS <transfire@...>
Date: 2005-10-07 22:00:13 UTC
List: ruby-core #6194
I was playing with unification some time ago. This is way I came with:

class Function

  #
  #    MODES    block   Proc.new    ?     lambda
  #           +----------------------------------
  #   @pcheck | false    true     false    true
  #   @rlocal | false    false    true     true
  #
  def initialize( name=nil, pcheck=false, rlocal=false, &func )
    @func = func
    @name = name
    @rlocal = rlocal  # return_local
    @pcheck = pcheck  # check_parameters

    @inst = false
    @bind = nil
  end

protected

  #def func=(n)  ; @func = n  ; end  # really need ?
  #def name=(n)  ; @name = n  ; end

public

  def name      ; @name   ; end
  def binding   ; @bind   ; end
  def instance? ; @inst   ; end
  def local?    ; @rlocal ; end
  def check?    ; @pcheck ; end

  # control the parameter checking mode

  def check
    @pcheck = true
    self
  end

  def nocheck
    @pcheck = false
    self
  end

  # control the local return mode

  def local
    @rlocal = true
    self
  end

  def nonlocal
    @rlocal = false
    self
  end

  #def with_mode( pcheck, rlocal=@rlocal )
  #  @pcheck = pcheck
  #  @rlocal = rlocal
  #  self
  #end

  def bind( obj, name=@name )
    raise 'method must have a name' unless name
    raise 'method must have an object to bind to' unless obj
    obj.class.send( :define_method, name, &@func )
    @bind = obj
    @inst = true
    @__m__ = obj.method( name )
    self
  end

  def unbind
    @bind = @bind.class
    @inst = false
    @__m__ = @__m__.unbind
    self
  end

  def define( mod, name=@name )
    raise 'unbound method must have a name' unless name
    raise 'unbound method must have an a module/class to be defined
within' unless klass
    klass.send( :define_method, name, &func )
    @bind = klass
    @inst = false
    @__m__ = klass.instance_method( name )
    self
  end

  def undefine
    @bind = nil
    @inst = false
    @__m__ = nil
    @bind.remove_method( @name )
    self
  end

  # usage methods

  def call(*args, &blk)
    if @pcheck && @func.arity > -1
      raise ArgumentError, "wrong number of arguments ( #{args.size}
for #{@func.arity} )" if @func.arity != args.size
    end
    if @bind and @inst       # method
      @__m__.call(*args, &blk)
    elsif @bind and ! @inst  # unbound method
      call_func(*args, &blk)
    else
      call_func(*args, &blk)
    end
  end

  def call_func(*args, &blk)
    if @rlocal
      lambda(&@func).call(*args, &blk)
    else
      @func.call(*args, &blk)
    end
  end
  private :call_func

  alias_method :[], :call

  def arity
    @func.arity
  end

  # -- LEGACY TERMS -------------------

  def as_block!  ; self.nocheck.nonlocal ; end
  def as_block   ; self.dup.as_block!    ; end

  def as_lambda! ; self.check.local      ; end
  def as_lambda  ; self.dup.as_lambda!   ; end

  def as_proc!   ; self.check.nonlocal   ; end
  def as_proc    ; self.dup.as_proc!     ; end

  def to_lambda
    lambda(&@func)
  end

  def to_proc
    Proc.new(&@func)
  end

  def to_umethod( mod, name=@name )
    raise 'unbound method must have a name' unless name
    raise 'unbound method must have an asscoitated to a class or
module' unless mod
    self.define( mod, name )
    return mod.instance_method( name )
  end
  alias_method :to_unboundmethod, :to_umethod

  def to_method( obj, name=@name)
    raise 'method must have a name' unless name
    raise 'method must have an asscoitated ibject binding' unless obj
    self.bind( obj, name )
    return obj.method( name )
  end

end


# test

if $0 == __FILE__

  require 'test/unit'

  # fixture

  class C
    def nonlocal_return
      Function.new{ return 'Y' }.nonlocal.call ; 'N'
    end
    def local_return
      Function.new{ return 'Y' }.local.call ; 'N'
    end
    def check_params
      Function.new{ |a,b| [a,b] }.check
    end
    def nocheck_params
      Function.new{ |a,b| [a,b] }.nocheck
    end
  end

  # testcase

  class TC_Function < Test::Unit::TestCase

    def setup
      @c = C.new
    end

    def test_returning
      assert_equal( "Y", @c.nonlocal_return )
      assert_equal( "N", @c.local_return )
    end

    def test_checkng
      assert_equal( [1,2], @c.check_params.call(1,2) )
      assert_raises( ArgumentError ) { @c.check_params.call(1) }
      assert_equal( [1,nil], @c.nocheck_params.call(1) )
    end

  end

end


# TRY BINDING

  f = Function.new { |x,y| x+y }

  # test call

  print f[1,2] ; puts "  [3]"


  # test binding

  class K ; end
  k = K.new

  print k.respond_to?(:add) ; puts "  [false]"

  f.bind(k, :add)

  print k.respond_to?(:add) ; puts "  [true]"
  print k.add(1,2) ; puts "  [3]"

  f.unbind

  print k.respond_to?(:add) ; puts "  [false]"


In This Thread