Skip to content

Instantly share code, notes, and snippets.

@masak
Created May 21, 2011 18:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save masak/984783 to your computer and use it in GitHub Desktop.
Save masak/984783 to your computer and use it in GitHub Desktop.
Must named arguments bind to positional parameters?

Must named arguments bind to positional parameters?

tl;dr summary

S06 says that named arguments in Perl 6 can bind to positional parameters.

Please remove that bit.

What S06 says

According to S06:989,

Bindings happen in declaration order, not call order, so any default
may reliably depend on formal parameters to its left in the signature.
In other words, if the first parameter is C<$a>, it will bind to
a C<:a()> argument in preference to the first positional argument.

That is, if your subroutine looks like this:

sub foo($a, $b) { say $a, " ", $b }

Then this call

foo("OH", :a<HAI!>);

will print HAI! OH, not OH HAI!.

The important point isn't that arguments can be made in any order, but that because of this feature, the names of positional parameters become part of the public API of any exported routine.

The arguments against this feature

In decreasing order of perceived importance.

  • Since Perl 6 programmers (experienced and newbie alike) don't seem to realize the feature is there, this has a high probability of leading to "over-defining" of APIs. That might not sound so bad until one realizes that a module author has committed not to change the names of any parameters in the module's exported routines.

  • It makes the binder more complicated. The default lookup would have to be by name (hash-like) rather than by position (array-like), and that's slower. S06 asserts (at S06:993) that performance can be regained by various optimizations. Such optimizations would further complicate the binder.

  • No-one uses the feature. To wit, the only examples of this feature that the undersigned have seen have been just that: examples. (The post chronicling the binder implementation comes to mind.) Had the feature been very important and something that Perl 6 coders out there reached for regularly, the above objection about binder complexity and performance challenges would be comparatively weaker. As it stands now, that complexity is harder to motivate.

Summary

We argue that binding named arguments to positional parameters is a treacherous, unwanted, and needlessly complex feature. Please remove it.

Regards,

Carl Mäsak and Jonathan Worthington

@dolmen
Copy link

dolmen commented Jan 5, 2012

+1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment