From method redefinition to classless Ruby.

T

Trans

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.
 
R

Robert Dober

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
 
T

Trans

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.
 
R

Robert Dober

Robert, c'est tr=E8s int=E9ressant! 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=3D{}

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


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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top