--- Larry Wall <[EMAIL PROTECTED]> wrote:
> [EMAIL PROTECTED] writes:
> : More questions on downwards binding,
> :
> : > for @foo -> $a, $b { # two at a time
> : > ...
> : > }
> :
> : Interpretation #1:
> : for @foo[0..$foo:2] -> $a,
> : @foo[1..$foo:2] -> $b
> : { ... }
> :
> : Interpretation #2:
> : for @foo -> $a { $b := $a; ... }
> :
> : I like this second one, as a short-cut, but it's not worth it. Am I
> : correct in assuming (as I henceforth shall) that ->(list) is a
> : distributive binding operation, which spreads all the lhs list
> elements
> : into rhs list elements?
>
> Neither of these is an accurate view of the current design. The
>
> -> LIST { ... }
>
> construct is declaring a closure with a certain parameter signature.
> The construct interpreting that closure (C<for> in this case) is free
> to pass arguments to those parameters however it sees fit.
What's the query or specification mechanism for users? Or are the
constructs going to have built-in semantics which we can't emulate?
(IOW, is there any way for me to know what the expected shape of
$closure(@_) will be?)
> : ==========
> :
> : Is it legitimate to make the precedence of -> high, and then
> : just require that distributive binding use parens? (Which resonates
> : well with existing usages: my ($arg1, $arg2) = @_;)
> :
> : for @ary1 -> ($nam1, $pw1, $uid1, $gid1, $gcs1, $dir1, $shl1 ),
> : @ary2 -> ($nam2, $pw2, $uid2, $gid2, $gcs2, $dir2, $shl2)
> : {
> : ...
> : }
>
> Yes, we could do it that way.
I'm for it.
> : ==========
> :
> : > : What would the default-variable scheme do in this context?
> : >
> : > That's a problem. But a more basic problem is, what would a
> C<when>
> : > do?
> :
> : Given that comma is a list operator, C<when> takes the last one.
>
> No, that's Perl 5 thinking. In Perl 6 the comma always produces a
> list
> even in scalar context.
>
> : for @a1 -> $a1,
> : @a2 -> $a2
> : {
> : when /Larry Wall/i { ++larrymeter; }; # Uses $a2 implicitly.
> : when $a1 =~ /Perl/ { ... }; # doesn't.
> : }
>
> It would be more likely to assume a given of any($a1,$a2).
Perl5 is the perl I think now. Sorry.
If the C<when> uses any() as its given context, multiple-binding loops
are going to have to (almost) always specify their comparisons. Not
necessarily a bad thing, even for $_. Although hash iteration won't be
as cool.
for %hash -> ($key, $value) {
when !defined($value) { delete %hash{$key}; }
}
Instead of
for %hash -> ($key, $value) {
when undef { delete %hash{$key}; }
}
(The real "dwim" would have based C<when> on the hash key, instead, so
I'm not too upset here... :-)
Will there be an "unless" version of when, for implied negation?
Perhaps special recognition of 'not' in that context, as:
when not Exception { ... }
when not /a/ { ... }
when not @ary { ... }
> : ==========
> : > you might not be able to say
> : > mumble $a -> $b,
> : > $b -> $a
> : > { ... }
> : > to mean
> : > mumble $a, $b -> $b, $a
> : > { ... }
> :
> : mumble ($a, $b) -> ($b, $a) # Makes a list and distributively binds
> it.
> : { ... }
> :
> : ===========
> : > And I think we have to allow for the case that there are no
> actuals
> : > to bind to the formals yet, which means we need an ordinarly
> looking
> : > parameter list after the ->. That is, as it currently stands,
> you
> : > can say
> : > my $closure = -> $a, $b { ... }
> : > as an equivalent to
> : > my $closure = sub ($a, $b) { ... }
> : >
> : > (The only difference being that the latter pays attention to
> "return"
> : > exceptions because it has an explicit "sub".)
> :
> : How would you invoke such a defun?
>
> Like any other anonymous subroutine or closure.
>
> : $closure($a, $b)
>
> That would work.
>
> : for @list $closure
> : map $closure @list
> : grep $closure @list
>
> Probably not.
Why not? While my syntax seems doomed to be wrong, your prior
statements gave me the impression that certain constructs (e.g.,
C<for>) may have closure-interpretation behavior that users would be
hard-pressed to emulate.
For example, from above:
> : > for @foo -> $a, $b { # two at a time
> : > ...
> : > }
It would be much easier for me to say
for @foo &$my_closure; # or however this should be written
than
my @bar ^:= @foo; # malleable ary with same refs
while @bar {
my @args;
... figure out behavior of $my_closure, set up @args ...
$my_closure(@args);
}
>
> : Finally, what does <- do?
>
> Numeric comparison of a negated value. Unless we turn := into <-,
> which
> would probably drive the mathematicians nuts.
As I recall, :- and := have both been introduced as inadequate textual
representations of "<-", so there's some justification there.
And frankly, it's too late for the mathematicians - they're already
nuts. ;->
=Austin
__________________________________________________
Do You Yahoo!?
Yahoo! Greetings - Send FREE e-cards for every occasion!
http://greetings.yahoo.com