Trey Harris writes: > Can anyone explain the rules of placeholder attachment? i.e., in the > example in Perl6::Placeholder's manpage, > > grep { $data{$^value} } 1..10; > > C<$^value> is clearly intended to attach to the outer closure C<{ > $data{$^value} }>, not the inner closure C<{$^value}>. But how does the > compiler know? What is the general rule?
This is a tough question, one to which I don't know the answer. I'll do something different for a change and speculate :-) In your first example, it does what you mean because the hash subscript isn't a closure. Curlies are always closures, except when they're not (to be specific, in hash subscripts and hash constructors). > It's easy to just say "don't nest placeholder-using closures," but that > doesn't seem workable in practice since every block is a closure, unless > placeholders are forbidden from all but the most trivial cases. Absurdly > trivial, it seems. How about > > $sub = { if $^a { $^b = $^a } }; I want this to work. It could look at C<if>'s signature and see that the closure it is expecting wants arguments, and since it doesn't, it knows that they belong outside. But that doesn't generalize. I think a better solution would be to associate all placeholders with the outermost closure that introduced a placeholder. For example: $sub = { { $^a + $^b } }; Would bind them both to the inner one, while: $sub = { $^a; { $^a + $^b } }; Would bind them both to the outer one. Since placeholders are meant for small scopes, this seems a good heuristic. That second example was obviously a hack to get it to work right. The clean way to do that would be: $sub = -> $a, $b { { $a + $b } }; Luke