[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

From method redefinition to classless Ruby.

Robert Dober

8/2/2007 8:43:00 PM

Hi list

Ara's post about method redefinition was extremely rich intellectual
food, took some time to digest, but I just thought I share my findings
with you.

http://ruby-smalltalk.blo...

Cheers
Robert

--
[...] as simple as possible, but no simpler.
-- Attributed to Albert Einstein

5 Answers

Trans

8/3/2007 3:00:00 AM

0



On Aug 2, 4:43 pm, "Robert Dober" <robert.do...@gmail.com> wrote:
> Hi list
>
> Ara's post about method redefinition was extremely rich intellectual
> food, took some time to digest, but I just thought I share my findings
> with you.

Ara and Pit are impressive meta-coders indeed. Think Ara might even
have a Prototype lib
you'd enjoy.

BTW, if we were all good little scouts and always modularized our code
one could use:

class Module
# Prepend an "aspect" module to a module.
#
# module X
# def x; "x"; end
# end
#
# module U
# def x; '{' + super + '}'; end
# end
#
# X.prepend U
#
# X.x # => "{x}"

def prepend( aspect )
aspect.send(:include, self)
extend aspect
end
end

Another trick for common injuns:

class Class

# Prepend an "aspect" module to a class.
#
# class Firetruck
# def put_out_fire(option)
# "Put out #{option}"
# end
# end
#
# module FastFiretruck
# def put_out_fire(option)
# super("very #{option}!")
# end
# end
#
# Firetruck.prepend(FastFiretruck)
#
# ft = Firetruck.new
# ft.put_out_fire('fast') #=> "Put out very fast!"

def prepend( aspect )
_new = method(:new)
_allocate = method(:allocate)
(class << self; self; end).class_eval do
define_method(:new) do |*args|
o = _new.call(*args)
o.extend aspect
o
end
define_method(:allocate) do |*args|
o = _allocate.call(*args)
o.extend aspect
o
end
end
end

end

Albeit that has some unfortunate shortcomings.

T.


Robert Dober

8/3/2007 9:26:00 AM

0

On 8/3/07, Trans <transfire@gmail.com> wrote:
>
>
> On Aug 2, 4:43 pm, "Robert Dober" <robert.do...@gmail.com> wrote:
> > Hi list
> >
> > Ara's post about method redefinition was extremely rich intellectual
> > food, took some time to digest, but I just thought I share my findings
> > with you.
>
> Ara and Pit are impressive meta-coders indeed. Think Ara might even
> have a Prototype lib
> you'd enjoy.
>
> BTW, if we were all good little scouts and always modularized our code
> one could use:
>
> class Module
> # Prepend an "aspect" module to a module.
> #
> # module X
> # def x; "x"; end
> # end
> #
> # module U
> # def x; '{' + super + '}'; end
> # end
> #
> # X.prepend U
> #
> # X.x # => "{x}"
>
> def prepend( aspect )
> aspect.send(:include, self)
> extend aspect
> end
> end
>
> Another trick for common injuns:
>
> class Class
>
> # Prepend an "aspect" module to a class.
> #
> # class Firetruck
> # def put_out_fire(option)
> # "Put out #{option}"
> # end
> # end
> #
> # module FastFiretruck
> # def put_out_fire(option)
> # super("very #{option}!")
> # end
> # end
> #
> # Firetruck.prepend(FastFiretruck)
> #
> # ft = Firetruck.new
> # ft.put_out_fire('fast') #=> "Put out very fast!"
>
> def prepend( aspect )
> _new = method(:new)
> _allocate = method(:allocate)
> (class << self; self; end).class_eval do
> define_method(:new) do |*args|
> o = _new.call(*args)
> o.extend aspect
> o
> end
> define_method(:allocate) do |*args|
> o = _allocate.call(*args)
> o.extend aspect
> o
> end
> end
> end
>
> end
>
> Albeit that has some unfortunate shortcomings.
>
> T.
Well I do not really see these shortcomings, I'd love to have this
mail as a comment to my blogpost BTW, would you mind?

Concerning Ara's Prototype library I have seen it flying by, I will
have a closer look, sure deserves an Exolink. But probably Ara's had
all the fun for himself already and there is nothing left to do for me
:(.

Cheers
Robert


>
>


--
[...] as simple as possible, but no simpler.
-- Attributed to Albert Einstein

Trans

8/3/2007 10:38:00 AM

0



On Aug 3, 2:25 am, "Robert Dober" <robert.do...@gmail.com> wrote:
> On 8/3/07, Trans <transf...@gmail.com> wrote:
>
>
>
> > On Aug 2, 4:43 pm, "Robert Dober" <robert.do...@gmail.com> wrote:
> > > Hi list
>
> > > Ara's post about method redefinition was extremely rich intellectual
> > > food, took some time to digest, but I just thought I share my findings
> > > with you.
>
> > Ara and Pit are impressive meta-coders indeed. Think Ara might even
> > have a Prototype lib
> > you'd enjoy.
>
> > BTW, if we were all good little scouts and always modularized our code
> > one could use:
>
> > class Module
> > # Prepend an "aspect" module to a module.
> > #
> > # module X
> > # def x; "x"; end
> > # end
> > #
> > # module U
> > # def x; '{' + super + '}'; end
> > # end
> > #
> > # X.prepend U
> > #
> > # X.x # => "{x}"
>
> > def prepend( aspect )
> > aspect.send(:include, self)
> > extend aspect
> > end
> > end
>
> > Another trick for common injuns:
>
> > class Class
>
> > # Prepend an "aspect" module to a class.
> > #
> > # class Firetruck
> > # def put_out_fire(option)
> > # "Put out #{option}"
> > # end
> > # end
> > #
> > # module FastFiretruck
> > # def put_out_fire(option)
> > # super("very #{option}!")
> > # end
> > # end
> > #
> > # Firetruck.prepend(FastFiretruck)
> > #
> > # ft = Firetruck.new
> > # ft.put_out_fire('fast') #=> "Put out very fast!"
>
> > def prepend( aspect )
> > _new = method(:new)
> > _allocate = method(:allocate)
> > (class << self; self; end).class_eval do
> > define_method(:new) do |*args|
> > o = _new.call(*args)
> > o.extend aspect
> > o
> > end
> > define_method(:allocate) do |*args|
> > o = _allocate.call(*args)
> > o.extend aspect
> > o
> > end
> > end
> > end
>
> > end
>
> > Albeit that has some unfortunate shortcomings.
>
> > T.
>
> Well I do not really see these shortcomings, I'd love to have this
> mail as a comment to my blogpost BTW, would you mind?

Go for it. The shortcoming in the later example are b/c it's static
and not dynamic, ie. it happens at the time of instantiation. So it's
not a simple thing to adjust on the fly. One could make it more
flexiable, but alas the Double Module Inclusion problem gets in the
way.

> Concerning Ara's Prototype library I have seen it flying by, I will
> have a closer look, sure deserves an Exolink. But probably Ara's had
> all the fun for himself already and there is nothing left to do for me
> :(.

Not at all, I think Ara's been looking for Prototype allies :) The
only problem with prototype.rb is that it's so far removed for writing
ordinary Ruby, few are willing to embrace it --it's almost like
writing in a different language.

T.


Pit Capitain

8/4/2007 2:55:00 PM

0

2007/8/2, Robert Dober <robert.dober@gmail.com>:
> Ara's post about method redefinition was extremely rich intellectual
> food, took some time to digest, but I just thought I share my findings
> with you.
>
> http://ruby-smalltalk.blo...

Robert, c'est très intéressant! I will keep your code and play a
little bit with it some time.

Regards,
Pit

Robert Dober

8/4/2007 4:25:00 PM

0

On 8/4/07, Pit Capitain <pit.capitain@gmail.com> wrote:
> 2007/8/2, Robert Dober <robert.dober@gmail.com>:
> > Ara's post about method redefinition was extremely rich intellectual
> > food, took some time to digest, but I just thought I share my findings
> > with you.
> >
> > http://ruby-smalltalk.blo...
>
> Robert, c'est très intéressant! I will keep your code and play a
> little bit with it some time.

Merci, very kind of you, I am sure you are aware of the very basic
Object#deepdup, I am about to "fix" it...
it will become

Kernel#__deepdup__ object, object_track={}

I guess you know what it will eventually do, it is the workerbee stuff
which is not interesting but has to be done :(.

Cheers
Robert
>
> Regards,
> Pit
>
>


--
[...] as simple as possible, but no simpler.
-- Attributed to Albert Einstein