[#4766] Wiki — "Glen Stampoultzis" <trinexus@...>

21 messages 2000/09/04
[#4768] RE: Wiki — "NAKAMURA, Hiroshi" <nahi@...> 2000/09/04

Hi, Glen,

[#4783] Re: Wiki — Masatoshi SEKI <m_seki@...> 2000/09/04

[#4785] Re: Wiki — "NAKAMURA, Hiroshi" <nakahiro@...> 2000/09/05

Howdy,

[#4883] Re-binding a block — Dave Thomas <Dave@...>

16 messages 2000/09/12

[#4930] Perl 6 rumblings -- RFC 225 (v1) Data: Superpositions — Conrad Schneiker <schneik@...>

Hi,

11 messages 2000/09/15

[#4936] Ruby Book Eng. translation editor's questions — Jon Babcock <jon@...>

20 messages 2000/09/16

[#5045] Proposal: Add constants to Math — Robert Feldt <feldt@...>

15 messages 2000/09/21

[#5077] Crazy idea? infix method calls — hal9000@...

This is a generalization of the "in" operator idea which I

17 messages 2000/09/22

[#5157] Compile Problem with 1.6.1 — Scott Billings <aerogems@...>

When I try to compile Ruby 1.6.1, I get the following error:

15 messages 2000/09/27

[ruby-talk:4906] Re: Re-binding a block

From: Dave Thomas <Dave@...>
Date: 2000-09-12 16:45:43 UTC
List: ruby-talk #4906
matz@zetabits.com (Yukihiro Matsumoto) writes:

> |The first parameter to the block is a proc object that wraps the
> |original routine, and the remaining parameters are those supplied by
> |the caller.
> 
> How did you do that.  Show me your (imcomplete?) code.

This is the version that makes no attempt to execute the function in
the object's context. I had to recreate this using about 1,000 emacs
undo's, so it may well be buggy, but I hope it gets the idea across.


  ###
  # This is the stuff behind the curtain
  #

     module Hook
       @@n = 0
       @@hook_function = Array.new

       def Hook.create(block)
         @@n += 1
         @@hook_function[@@n] = block
         @@n
       end

       def Hook.call(from, n, block, *args, &orig_fn)
         b.call(orig_fn, *args, &block)
       end

       def Hook.getHook(n)
         b = @@hook_function[n]
       end
     end


     class Module
       def hook(sym, &block)
         if block.nil?
           raise "Missing block to hook function"
         end

         n = Hook.create(block)
         fn = sym.to_s
         class_eval %{
            alias hook_#{n} #{fn}
            def #{fn}(*args, &block)
              b = Hook.getHook(#{n})
              orig_fn = proc  { hook_#{n} }
              b.call(orig_fn, *args, &block)
            end
         }
       end
     end

  ###
  #  and this is the stuff the user sees
  #

     class String
       hook :upcase do |_upcase|
         _upcase.call.tr('_', '~')
       end
     end

     p "foo_bar".upcase    #=>  FOO~BAR

In This Thread