Steve Fink writes:
> Ok, I'm back to argument passing. I'm starting a new thread because
> I'm lazy and I have to scroll back too far in my mailer to see the old
> arg passing thread. :-) And yes, most of this message should also be
> on -languages.
Which it now is. Although, there are some internals issues, too, so I
wonder how we can do this. How about, when someone responds to either
an -internals- or a -language-specific question, he directs it only to
the appropriate list.
> Could somebody tell me where I go wrong:
>
> If you have a prototype
> sub f ($a, $b, $c) { ... }
> then you should pass $a in P5, $b in P6, etc. So the code will look
> like:
> .param $a
> .param $b
> .param $c
>
> If you declare a sub without a prototype, it should default to ([EMAIL PROTECTED]).
Yep.
> A slurpy array parameter puts its corresponding arguments in a list
> context, which is the same as a flattening context. This is stated in
> E6 and S6, though not in A6 as I read it (but it doesn't disagree
> either.)
>
> Let's add a prototype-less sub for use in discussion:
> sub g { ... }
>
> Is there any way to create a prototype that, when called with any
> number of array variables, would pass all of the arrays as objects?
> So, for example, f(@x, @y, @z) would do the right thing for exactly
> three arrays, but couldn't handle f(@x,@y,@z,@w). g(@x, @y, @z) seems
> to flatten all of them together. I'm sure something like
> g([EMAIL PROTECTED],[EMAIL PROTECTED],[EMAIL PROTECTED]) would work, but what if I
> want to do the call without
> backslashes?
This was described in A6. It goes:
sub g([EMAIL PROTECTED] is context(Scalar)) {...}
> The calls f(1, 2, 3) and g(1, 2, 3) should both generate
> .arg 1
> .arg 2
> .arg 3
> ...except instead of constant ints, you'd probably need PMCs.
But constant ones :-)
> Splatted array params are aliases to the actual args. So
>
> sub h ([EMAIL PROTECTED]) { @params[1] = 'tuna!'; }
> h($x, $y, $z);
>
> should set $y to 'tuna!'.
No, it should give an error. Parameters are declared constant by
default. You'd have to:
sub h ([EMAIL PROTECTED] is rw) { @params[1] = 'tuna!' }
How to make the distinction between a constant array and an array of
constants is still unclear to me.
> Would h(@x) set @x[1] to 'tuna!'? If so, then does
>
> h(@x, $y)
>
> change $y's value depending on the number of elements in @x?
Ouch. Yeah, I guess so. I don't expect to see C<[EMAIL PROTECTED] is rw> a
whole lot, but that is a bit of a pickle to implement.
> It seems that @params is either a magical array where lookups trigger
> a runtime computation of where that index would be found in the
> original argument list, or it is an array of references to either
> variables or <variable,key> pairs, and all of those references are
> built at runtime immediately when the call is made. (Which rather
> defeats the default laziness of arrays.) Actually, "proxies" might be
> a more accurate term. You should be able to pass @params into another
> function just like any other array, or do
>
> $gloof = (rand(100) < 30) ? @params : @normal_array;
>
> Or maybe h(@x) does NOT set @x[1] to 'tuna!'?
>
> Ok, the whole aliasing thing was something of a tangent. Back to f()
> and h(), which are really f($,$,$) and h(*@).
>
> I can use names to pass required arguments, but all positional args
> must precede all named args. So then is this legal:
>
> f(1, 2, b => 1.5)
>
> or must all of the positional args referred to by named parameters
> follow those passed positionally? (There are two orders -- argument
> order and parameter order. In which of those two must all positionals
> precede the named params?)
Both. (In parameter order, named-only must come after positionals) So
f(1, 2, b => 1.5) was correct.
> In
>
> sub j($a, ?$b, *%c) { ... }
>
> can I actually pass %c after the rest of the params? If I call it with
>
> j(1, $blue => 'red')
>
> then does that compile down to
>
> .param 1
> .param named_arg_table
>
> ? How is the callee supposed to know whether the 2nd param is $b or
> %c? What if $blue happened to be "b"?
If $blue was 'b', then j would get $b to be 'red'. Run-time positionals
are another one of those things I don't expect to see all that often
(but that might be a different story in my code >:-).
The real problem arises in:
j(1, 2, $blue => 'red')
If $blue happens to be 'b'. I think the behavior then would be $b gets
2, and %h gets { b => 'red' }. In particular, I think it's wrong to
croak with an error here.
> If I do it the other way around,
>
> .param named_arg_table
> .param 1
>
> then at least I can always assume the named args are passed first, and
> use the arg count to directly determine whether $b was passed or not.
> But then all Perl6 subroutines would have to take a named arg table as
> their first argument, by convention, and cross-language calls would
> need to be aware of this -- even when calling unprototyped. ("Oh,
> yeah, if you're calling a Perl6 routine you have to pass an empty
> hashtable as the first param.")
>
> I have a first cut at Perl6 parameter passing. [snip]
Luke