Dave Storrs <[EMAIL PROTECTED]> writes:

> On Wed, Dec 18, 2002 at 09:31:41AM +0000, Piers Cawley wrote:
>> Dave Storrs <[EMAIL PROTECTED]> writes:
>> > It seems like Perl6 is moving farther and farther away from Perl5's
>> > (almost) typelessness.  
>> 
>> It depends what you mean by typed. Perl has always had strongly typed
>> *values* (which strike me as being a damn sight more useful than
>> typed variables). 
>
> No argument from me.  When I want/need the abilities that come with
> specifying type, I want the language to support it.  I just don't want
> to _have_ to do it, when I don't want/need those abilities.
>
>
>>In a language with typed values, being able to
>> declare a typed variable is useful for a few reasons:
>> 
>> * After watching things in a profiler, you sacrifice programmer
>>   flexibility by typing a couple of variables as a way of giving the
>>   Optimizer something to get its teeth into (if you have a typed
>>   variable then you can limit the amount of runtime checking you have
>>   to do in favour of compile time checks)
>
> Agreed.
>
>
>> * For setting up multiply dispatched methods and functions. Consider
>>   the example below (which I know I've used before).
>> 
>>   sub grep ( (Rule | Block) $selector, @*args ) { @args.grep($selector) }
>>   sub grep ( (Rule | Block ) $selector, Collection $collection ) {
>>       $collection.grep($selector)
>>   }
>> 
>>   sub grep ( WeirdSelector $selector, @*args ) {
>>       grep $selector.as_block, *@args;
>>   }
>> 
>>   Because we can declare the types of the function parameters we can
>>   let the language sort out the dispatch for us. Without typed
>>   parameters and multi dispatch those three function definitions
>>   become:
>> 
>>   sub grep ( $selector, $first, @*args ) {
>>       if @args.length {
>>           return [ $first, @args ].grep($selector);
>>       }
>>       else {
>>           $first.grep($selector);
>>       }
>>   }
>> 
>>   method Object::grep ($self: $selector {
>>       [ $self ].grep($selector);
>>   }
>
> Hm.  I'm way short on sleep today, so I'm probably missing something,
> but I don't see why Perl can't sort this out without a specific
> typing.

Well, you've got to specify the types *somewhere* when you set up
your multimethods. The parameter list seems a better place than most. 

> On a more nit-picky level, the first two subs in the top block seem to
> show that arrays are not derived from Collection.  Surely, if
> everything is an object, they should be?

They are, but that C<< @*ary >> is *not* the same as C<< @ary >> in
an arg list, it flattens the remaining arguments into an array, on
which we then call the grep method. Essentially the variant is only
there to normalize the list of arguments.

Reply via email to