Trans
9/7/2007 11:51:00 AM
On Sep 7, 1:30 am, "Robert Dober" <robert.do...@gmail.com> wrote:
> On 9/6/07, Trans <transf...@gmail.com> wrote:
>
>
>
>
>
> > On Sep 6, 11:54 am, "Robert Dober" <robert.do...@gmail.com> wrote:
> > > On 9/6/07, Trans <transf...@gmail.com> wrote:
>
> > > > On Sep 5, 6:46 pm, Yukihiro Matsumoto <m...@ruby-lang.org> wrote:
> > > > > Hi,
>
> > > > > In message "Re: before, after and around Ruby 1.9"
> > > > > on Thu, 6 Sep 2007 10:32:03 +0900, Joel VanderWerf <vj...@path.berkeley.edu> writes:
>
> > > > > |What if you want to reopen _without_ the "around" semantics?
>
> > > > > I thought we need to remove the previous one first.
>
> > > > > |Could we have these two variations:
> > > > > |
> > > > > |class Foo < Foo # <-- This is a type error in 1.8
> > > > > | def foo; super; end # AROUND
> > > > > |end
> > > > > |
> > > > > |class Foo
> > > > > | def foo; super; end # REDEFINE
> > > > > |end
> > > > > |
> > > > > |At least that is a conservative extension.
>
> > > > > Or maybe providing two supers, one for the current behavior, the other
> > > > > for the new. I don't whatever name is suitable for new super yet,
> > > > > however.
>
> > > > How would you be sure (and why would you want to?) know when a
> > > > "previous" exists or not? It rarely make sense to avoid advice.
> > > > However, when absolutely needed one can fallback to directed calling
> > > > with things like:
>
> > > > super_at(Object)
>
> > > Inheritance dependecies, oooouch, danger, hot do not touch!
>
> > Well, that was kind of my point. As often as this is useful, so is
> > skipping over around advice.
>
> Maybe I read you wrong, there should be a way for metaprogrammers to
> know where a method was defined, but that should not be the *only* way
> to access to super or redefined methods.
> Actually
> super_at(object/module/class)
> might be a useful tool, but I would like to have
> super
> and
> old (or next or whateverMatzLikes ;)
> to just step up one level for "non meta use"
Yes, that's a common consideration, but there's a subtle reason why
you don't really want that, which is what I'm trying to get across.
When someone writes an around advice, they expect it be wrap the the
method being advised. If the programmer of the original method used
#super rather than #old, it wouldn't work. And that's bad. Because the
point is, I should be able to advise any method I want.
Of course, there may arise special cases where skipping advice in
needed, but that is a rare/dangerous meta-coding need, in which case
#super_at should be more than enough to satisfy the requirement, eg.
super_at(self.class) for instance.
> > much more importantly, any such implementation is going to be severely
> > hampered in execution efficiency compared to a native capability.
>
> Losing you here, do you mean that special bytecode would be emitted
> for these three constructs that would be more efficent than for method
> redefinition?
No no. I simply mean that any lib built-on top of Ruby's current meta-
programming constructs is going to be much slower (and less robust)
than something built-in to Ruby itself, basically because method
composition operates at such a low-level.
T.