develooper Front page | perl.perl6.language | Postings from March 2009

Re: new Capture behavior (Was: Re: r25685 - docs/Perl6/Spec)

Thread Previous | Thread Next
From:
Darren Duncan
Date:
March 5, 2009 15:25
Subject:
Re: new Capture behavior (Was: Re: r25685 - docs/Perl6/Spec)
Message ID:
49B05F55.9010007@darrenduncan.net
Larry Wall wrote:
<snip>
> So what's the difference between a function and a method then?
> Nothing on the implementation end.  The only difference is in the
> call end; we have different calling notations that invoke different
> dispatchers.  Each of those dispatchers resolves the membership
> and ordering of its multiple candidates in its own way, using some
> combination of namespace and type filtering, but not the presence or
> absence of a ':' in either the Capture or the Signature.
<snip>

This all sounds reasonable to me, but I'm wondering how to make it work in 
certain ways that I would like.

Case in point, with my Set::Relation module.  That module is an object-oriented 
derivation of a module design that was originally just functional, having a 
collection data type as its main operand and all of its routines originally just 
being functions.  The object-oriented Set::Relation is somewhat unnatural 
because its functionality is not supposed to consider any particular routine 
argument as special, that is an invocant.  The reason I made it OO was so users 
wouldn't have  to use Package.func syntax and wouldn't have to import the 
routines.  Now, perhaps one solution is to make this non-OO and export its 
routines, but I figure people may want to say $arg1.foo($arg2) or whatever.

Here's a question:

Say I had an N-adic routine where in OO terms the invocant is one of the N 
terms, and which of those is the invocant doesn't matter, and what we really 
want to have is the invocant automatically being a member of the input list.

For example, say we had "method natural_join of R (R $topic: Array of R 
$others)" but what we really want is "method natural_join of R (Array of R 
$topic)" so that within the natural_join method we can simply refer to the array 
$topic and the invocant just happens to be one of its elements, as if 
natural_join were just a function with no invocant.

So, is there some way, or is it reasonable for there to be, to declare a method 
in Perl 6 such that say it is declared with say an Array of R or Set of R etc 
parameter and that parameter is marked somehow, maybe with a trait, to say it 
automatically gains the invocant as one of its elements?  This is sort of the 
opposite of unpacking array parameters.  Maybe something like "method 
natural_join of R (Array of R $topic is enveloping self)", but keep in mind that 
it should work if the parameters in question are named instead.  Then one could 
invoke it with say "$r1.natural_join( [$r2, $r3] )" or some such.

I'm thinking maybe there was an answer to this in Synopsis 6 but I didn't see it.

Thank you. -- Darren Duncan

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About