That's lifetime of the object, which is still monkeytyping, just on a less
global level than modifying the class directly.
Compare the Ruby example to this: (syntax is entirely made up):

my $foo = SomeClass.new;
{
     methodical bar(SomeClass) { say "Hello, world!" }
     $foo.bar  # "Hello, world!"
}
$foo.bar # Error, undefined method bar. Or reverts to SomeClass's bar if it
exists.

But doesn't Perl 6 already have this with lexical multimethods ("my multi")
?


On Wed, Apr 21, 2010 at 10:11 AM, John Harrison <ash....@gmail.com> wrote:

> Ruby has a similar functionality that lets you define methods on an
> instance
> object. Really, its how class methods are specified, you just put the class
> name as the name of the object. Here is an example:
>
> a = Object.new
> def a.foo
>   puts "foo and #{self}"
> end
>
> They will stay on the object as long as the object exists. So, if its a
> scoped variable, it will go away when you leave the scope.
>
> --
>
> John Harrison
>
>
> On Wed, Apr 21, 2010 at 7:49 AM, Andrew Whitworth <wknight8...@gmail.com
> >wrote:
>
> > This idea strikes me as being extremely similar to C#'s extension
> > methods, a feature that I've found to be particularly beneficial in
> > many cases. The fact that these methodicals are lexically-scoped is
> > especially nice, and the fact that they can be applied post-hoc to
> > arbitrary data items that have no prior support for them (like Parrot
> > objects) would be very nice to have on Parrot in particular where
> > language interoperation could be a big deal in the future.
> >
> > +1
> >
> > --Andrew Whitworth
> >
> >
> >
> > On Wed, Apr 21, 2010 at 3:16 AM, Stefan O'Rear <stefa...@cox.net> wrote:
> > > (The following describes a proposed extension to Perl 6, methodical
> > scoped
> > > operators or methodicals for short.  It is written in the present tense
> > for
> > > simplicity but should be understood as the future conditional.)
> > >
> > > Normally, when you write a method call, the definition of the method is
> > > entirely in the domain of the receiver's class:
> > >
> > >    $object.make-me-a-sandwich;  # $object gets to decide what this
> means
> > >
> > > However, this is not always how things work.
> > >
> > >    $object.WHAT;  # Larry says that WHAT should return the protoobject
> > >
> > > WHAT, WHENCE, postcircumfix:<[ ]>, and similar operators have semantics
> > > (although not implementation) defined by the language itself.
> Currently,
> > Perl 6
> > > fakes this by having all values inherit from Any or Mu or Cool, which
> > define
> > > the basic, overridable versions of these method-like operators. This
> > cheat
> > > actually works pretty well in a homogeneous environment, but it fails
> if
> > we have
> > > to consider objects from outside Perl 6.
> > >
> > >    $parrot-array.WHAT;  # Method WHAT not found for invocant of type
> ...
> > >
> > > The problem here is that scopes are conflated - WHAT is defined by the
> > > language, which is approximately a lexical scope, while methods on an
> > object
> > > are in some entirely different scope.
> > >
> > > A methodical is an operator which syntactically behaves as a method but
> > is
> > > subject to scoping rules.  Methodicals are defined using the ordinary
> > method
> > > keyword, qualified with my or our.  (TODO: This seems the most natural
> > syntax
> > > to me, but it conflicts with existing usage.  Which is more worth
> having
> > on
> > > it?)  Methodicals do not need to be declared in classes, but they
> should
> > > generally have declared receiver types.
> > >
> > >    {
> > >        my method make-me-a-sandwich(Num:) { ... }
> > >
> > >        2.make-me-a-sandwich; # calls our method
> > >
> > >        "ham".make-me-a-sandwich; # either an error, or method dispatch
> > >    }
> > >
> > >    2.make-ma-a-sandwich; # ordinary method dispatch
> > >
> > > The primary use case for methodicals is naturally in the setting.  Many
> > of the
> > > methods which are currently defined on lower-level types could become
> > > methodicals and they would be available on all values, in any code
> > compiled
> > > within the Perl 6 setting, without polluting the referencing
> environments
> > of
> > > non-Perl 6 code in the same object environment.
> > >
> > >    my method WHAT($thing) { ... }
> > >
> > > Rakudo already uses something very much like an ad-hoc direct
> > implementation of
> > > methodicals to handle postcircumfix operators.
> > >
> > > Methodicals are also useful in user code where the most natural
> phrasing
> > of a
> > > calculation is as a property of a system type, for instance from the
> > Mandelbrot
> > > Advent example:
> > >
> > >    my method mandel(Complex:) {
> > >        my $z = 0i;
> > >        for ^$max-iterations {
> > >            $z = $z * $z + self;
> > >            return 1 if ($z.abs > 2);
> > >        }
> > >        return 0;
> > >    }
> > >
> > > Since methodicals do not pollute global referencing environments, and
> do
> > not
> > > compromise encapsulation, MONKEY_TYPING is not needed here.
> > >
> > > A methodical defined inside a class functions much like a private
> method.
> > > There may be something interesting here, but I'm not entirely sure
> what.
> > >
> > > There are two natural implementations of methodicals in terms of other
> > language
> > > features.  First, it is possible to treat methodicals as ordinary
> methods
> > > (monkey typing under the hood), but with generated names; the true name
> > is
> > > bound to the program name only within the correct scope.  If possible,
> > the
> > > methods should be treated as anonymous, accessible only though an
> opaque
> > name
> > > object.  Care must be taken to prevent incorrect exposure of private
> > fields and
> > > methods.
> > >
> > > Alternatively, a methodical can be desugared to a multi sub with the
> same
> > scope
> > > as the methodical itself, changing statically named method calls into
> > calls to
> > > the methodical.  This gives reflection invisibility and privacy for
> free,
> > but
> > > may require more work to get the multi call semantics exactly right.
> > >
> > > Thoughts?
> > >
> > > -Stefan
> > >
> > > -----BEGIN PGP SIGNATURE-----
> > > Version: GnuPG v1.4.9 (GNU/Linux)
> > >
> > > iEYEARECAAYFAkvOpjcACgkQFBz7OZ2P+dKJ4wCfUpWUDv2/PqYUF1k0hsYaiAns
> > > HFAAn2K5SfcJnGq5xk1PIy0QG69LMrwR
> > > =uvrz
> > > -----END PGP SIGNATURE-----
> > >
> > >
> >
>



-- 
Mark J. Reed <markjr...@gmail.com>

Reply via email to