On Tue, 2 Jul 2002, Michael G Schwern wrote: > On Fri, Jun 28, 2002 at 01:21:50PM -0700, Erik Steven Harrison wrote: > > Over on Perlmonks someone was asking about Perl 6's ability to have named > > argument passing. He also asked about the Jensen Machine and Ruby iterators. > > Now, just being on this list has taught me so much, but, I'm not quite sure > > how it works, practically speaking, and whether or not we'll get in in P6. > > (I understand the abstract o fpass by name, but not how we use it). Could > > someone explain it to me, and tell me what the Perl 6 stance on the matter > > is? > > * Yes, Perl 6 will have named arguments to subroutines. > > What I can remember from the Perl 6 BoF is it will look something like this: > > sub foo ($this, $that) { > print $this if $that; > } > which is like: > > sub foo { > my($this, $that) = @_; > print $this if $that; > } > > somebody else on this list can handle explaining how that all works better > than I can. There's stuff about pointy subroutines, ->, method topics, > etc... *hand wave* >
Yep (far as I know. The only way I can secure my knowledge is to be arrogant and then be confirmed or negated). After this, you can call foo like so: foo("Bar", 1); Or like this: foo(that => 1, this => "Bar"); Or like this: foo("Bar", that => 1); They all do the same thing. As far as pointy subs, -> is just a synonym for sub, with some extra sugar sprinkled on. You don't need to put parenthesis around the arglist, and I think $_ is always aliased to the first argument. If there are no arguments, the sub takes one argument and it is aliased to $_. Am I right? Of course you can't make named subs with ->, just anonymous ones. > I *think* you will also be able to do this, at least I can't see why you > wouldn't be able to: > > @stuff = grep { length $^foo >= 42 } @list; > > which is nice for nested greps and maps. You don't have to fight over who > has $_. Yep, grep takes a closure argument now. If you wanted to make things interesting, you could do it this way too. @stuff = grep -> $foo { length $foo >= 42 } @list; > * Yes, Perl 6 will have the moral equivalent to Ruby iterators. > > > Ruby also has it's |$a| mechanism to name the arguments. Presumably, you'll > get the same effect with the implied arguments I mentioned earlier. > > File.foreach '/usr/dict/words' { > print $^line; > } > > Something like that. Or File.foreach '/usr/dict/words' -> $arg { print $arg; } Luke