On Thu, Mar 19, 2009 at 02:18:35PM -0700, Darren Duncan wrote:
> I have a question and a request.
>
> In http://perlcabal.org/syn/S06.html#Named_subroutines it says:
>
> The general syntax for named subroutines is any of:
>
> my RETTYPE sub NAME ( PARAMS ) TRAITS {...} # lexical only
> our RETTYPE sub NAME ( PARAMS ) TRAITS {...} # also package-scoped
> sub NAME ( PARAMS ) TRAITS {...} # same as "our"
>
> The return type may also be put inside the parentheses:
>
> sub NAME (PARAMS --> RETTYPE) {...}
>
> In http://perlcabal.org/syn/S06.html#Subroutine_traits there is a
> distinguishing between 'of' and 'returns', such that 'of' is part of the
> external routine signature and 'returns' is just an internal constraint.
That bit was incorrect, "returns" should have been "as", to be consistent
with S02 "Hierarchical types".
> Now first of all I wanted to ask/clarify, are all of the above forms, the
> "RETTYPE sub" and "--> RETTYPE", equivalent to the "of" trait, meaning
> they are part of the external signature, and that none are like "returns"
> being internal to the routine only? That's how I hope it is.
Yes, --> is the "of" type, not the "as" type, as S02 I think says.
> Second, since the "sub NAME (PARAMS --> RETTYPE) {...}" form looks nice
> visually, I would like to request a variant of that form, that flips the
> arrow:
>
> sub NAME (RETTYPE <-- PARAMS) {...}
>
> I ask because I like to declare my result type before my parameters,
> since the declaration then reads in the same order as corresponding
> invocation items, as well as having the shorter and more important
> declaration appearing first (result type vs parameters):
>
> my $result = myfunc( $arg1, $arg2 );
>
> And at the same time it has the visually distinctive arrow syntax which
> is very easy to read.
>
> While "RETTYPE sub" and "of RETTYPE" provides the first advantage, it
> doesn't provide the second.
>
> Also providing both versions gives symmetry in the way that you have both
> of the <== and ==> feed operators so users can order operations visually
> as per their preference.
>
> I also don't believe you are already using <-- for anything so it is free.
>
> And I don't believe that there should be any problem incorporating this
> option given the other issues like named invocants or longname
> parameters; you just keep those with PARAMS as you did before, putting
> the lot on the right side of the <--.
>
> Note that this request is only useful to me if the existing --> means
> 'of' and not 'returns'.
>
> Thank you in advance for considering this request.
Well, yes, that would be pretty, but the big problem with it is that
it's terribly ambiguous, given that the other-ended form can also
start with a type. (I can think of at least five mechanisms to force
it to work, but they're all pretty ugly when we're trying to maintain
a predictive parser outside of opererator precedence expressions,
which this isn't one of.) It's also getting just a little dicey to
provide a *fourth* way to do something when we already have three.
Larry