Re: Default invocant of methods

2005-05-31 Thread Larry Wall
On Fri, May 27, 2005 at 10:59:25PM +0200, Ingo Blechschmidt wrote:
: Hi,
: 
: what is the default invocant of methods?
: 
:   method blarb ($normal_param) {...}
:   # Same as
:   method blarb (Class | ::?CLASS $invocant: $normal_param) {...}
:   # or
:   method blarb (::?CLASS $invocant: $normal_param) {...}
:   # ?
: 
: I prefer the latter, as then one can't accidentally call a instance
: method on the class -- i.e.
:   Foo.blarb   # will die.

It will almost certainly die anyway the moment you try to do something
instancely with it.

: You can always specify Class as invocant, if you want to have a class
: method.

Hmm, well, maybe, provided Class is the parent of all possible class
classes, but it's not entirely clear we want to assume that.  We could
get potentially get other kinds of metaclass and dispatcher classes
involved, especially if we've inherited things across languages.
At some point you have to trust your dispatcher to hand you things
you can work with, and that may involve some kinds of structural
or role equivalence rather than just class name equivalence.

Hmm, maybe Class is really a role then, and anything that does Class
can pretend to be one.

: Opinions?

From the efficieny viewpoint, I'd rather leave it untyped, and rely
on the dispatcher to do my type checking.  Of course, there are times
you'd like the compiler to know that the type of $?SELF is consistent
with the current class, but that's a different matter than run-time
type checking, which an explicit type tends to imply.

Larry


Re: Default invocant of methods

2005-05-28 Thread Yuval Kogman
On Fri, May 27, 2005 at 22:59:25 +0200, Ingo Blechschmidt wrote:
 Hi,
 
 what is the default invocant of methods?
 
   method blarb ($normal_param) {...}
   # Same as
   method blarb (Class | ::?CLASS $invocant: $normal_param) {...}
   # or
   method blarb (::?CLASS $invocant: $normal_param) {...}
   # ?
 
 I prefer the latter, as then one can't accidentally call a instance
 method on the class -- i.e.

I think I do too... In p5 this was a bit too easy to abuse.

However, I think this introduces another issue- how can we subvert
the parameter checking?

Sometimes it makes sense too call a method on a class instead of a
module, even if the author didn't think of it first. I'd like that
to be possible, and further more, I'd like subsequent calls from
that method to also ignore the type checking.

I think the mechanism I want is like C casts, in the sense that they
don't really do anything, they are more like oh, it's ok, it can
pass as a 

-- 
 ()  Yuval Kogman [EMAIL PROTECTED] 0xEBD27418  perl hacker 
 /\  kung foo master: /me sneaks up from another MIME part: neeyah!



pgpf36xn9g2CF.pgp
Description: PGP signature