On Sep 7, 2022, at 1:41 PM, Brian Goetz 
<[email protected]<mailto:[email protected]>> wrote:
. . .

Where we stumble is on method parameters, because method parameter names serve 
two masters -- the implementation (as the declaration of a variable) and the 
API (as part of the specification of what the method does.)  Among other 
things, we like to document the semantics of method parameters in Javadoc with 
the `@param` tag, but doing so requires a name

And a general language-design pattern is that if you discover a single language 
feature is serving two masters, consider splitting it into two features, one to 
serve each master (and then perhaps continue to allow the old feature, 
explaining it in terms of the new, more general features.

In this case, a single feature (method parameter name) provides both a name for 
the implementation and a name for the API. So, consider having a way to provide 
two names. Common Lisp has been doing this for its keyword parameters for 
almost four decades:

(defun foo (&key ((:color c) white) ((:angle a) 0))
   … c … a …)

(foo :color black :angle 45)

So the names :color and :angle are part of the API, and the names c and a are 
the variable names that are actually bound for use in the body.

When you write

(defun baz (&key (color white) (angle 0))
  … color … angle)

it is by definition an abbreviation for

(defun baz (&key ((:color color) white) ((:angle angle) 0))
  … color … angle)

So you don’t have to write out two names in the common case where you actually 
do want them to be “the same”.

————

So in Java we could pick some crazy syntax to allow specifying two names for a 
method parameter, the API name and the implementation (bound variable) name:

int colorHack(int red=>r, int green=>g, int blue=>b, int fromIndex=>from, int 
toIndex=>to) {
// Here the names `r`, `g`, `b`, `from`, and `to` are in scope.
}

and then if you really want to ignore a parameter:

int colorBlindHack(int red=>_, int green=>_, int blue=>_, int fromIndex=>from, 
int toIndex=>to) {
// Here the names `from` and `to` are in scope.
}

Not sure we want to go in that direction, but we should at least consider it.

—Guy

Reply via email to