On Sat, 2005-05-14 at 22:06 +1000, Damian Conway wrote:
> Luke wrote:
>
> > If the alternatives are:
> >
> > * declare $self, use $self.method, and .method for calling on $_
> > * use .method, and use $_.method for calling on $_
> >
> > I'd say the former has no case.
>
> I, for one, am not nearly so certain of that.
Well, there are many more alternatives (though I vastly prefer the
latter from the above). Here are some:
* Reverse-auto-accessors. That is, for any method, there is a
corresponding attribute whose value is (given that there is no
attribute declared, which would obscure it) a reference to the
method. These attributes are fictions, and only accessible from
inside the class, but from within, that gives you the ability to
call "$.method(...)" without breaking the syntax at all.
However, I'm assuming here that multi-methods exist as a single
method (i.e. you can have a reference to all at once), and
dereferencing goes through the normal signature matching.
* Create a default invocant variable that's easier to type than $?
SELF (ulch, tainted meat!) like "$$" (since $*PID replaces it);
"$." (Larry didn't like that because of "$..method", though; or
$, (which is nice because $,.method is fairly easy to type); or
what about an identifier name like "$me"? I'd prefer "$no", but
a) it's wrong to English speakers and b) "wa" got shot down
before ;-)
* Have an invocation operator that defaults to the current
invocant other than ^. Things that come to mind are "do method
(...)", "go method(...)", or "to method(...)"
* Have a pragma for .method meaning $?SELF.method so tha the
programmer can choose, such as "use method :on_invocant" or "use
method :invocant"
> for @clients {
> my $value = .volume * .rate;
> my $cost = .management_ratio * .volume;
> .add_profit($value - $cost);
> .gen_report()
> }
I like the look of that, and the way things stand now, people will write
that and it will work, but then they'll be shocked when they put in a
loop or given and it stops working inside the scope that contains a $_
that's not the invocant.
I think keeping $_ procedural and having "." favor OO is a smarter idea
than not, but that's just me.
> Calling lots of methods from within another method just isn't a frequent
> requirement...and if it is, it's usually isolated to one or two high
> level methods within a class. Especially when your language gives you
> dot-variables to access your attributes [...]
This sounds like a vote for reverse-auto-accessors....
> Furthermore, all my experience of *general* programming suggests that OO
> programming is only one choice of code structure, and not even the most
> widely applicable or appropriate one, especially when your language offers
> good support for procedural and functional programming approaches.
I agree. However, I don't like how surprising all of this will be for
the OO crowd. Make OO one option of many, sure, but don't make it hard
to cope with.