Good point - between that and your previous message, I withdraw the label idea.

/be

Sent from my iPhone

> On Nov 10, 2013, at 7:47 PM, "Mark S. Miller" <[email protected]> wrote:
> 
> Also
> 
>     function f(args: x, y, z) {
> 
> will suggest to TypeScript readers that the parameter "args" has type "x".
> 
> 
> 
>> On Sun, Nov 10, 2013 at 11:44 AM, Mark S. Miller <[email protected]> wrote:
>> Hi Brendan and Allen, you are both responding only to my point #1. I 
>> consider my point #2 --- cognitive load of the reader on encountering a 
>> rarely seen construct --- to be the more significant criticism here.
>> 
>> On these grounds, your
>> 
>>     function f(args: x, y, z) {
>> 
>> is worse. Given how ":" is already used in JS, this suggests that "args" is 
>> either a label name, which the more astute reader can easily disqualify, or 
>> a property name, suggesting some shorthand for named parameters.
>> 
>> Note that I am not saying that the meanings of all syntactic constructs have 
>> to be guessable with no guidance. But the rarely used ones do.
>> 
>> 3) Awkward syntax for some rarely used cases is the price of good syntax for 
>> common cases.
>> 
>> 
>> 
>> 
>>> On Sun, Nov 10, 2013 at 11:08 AM, Brendan Eich <[email protected]> wrote:
>>> On the other hand, we are this close in ES6 to relieveing people from 
>>> having to use arguments at all.
>>> 
>>> I like the intention behind Allen's idea. To defend the concrete syntax a 
>>> bit, one would argue that only the final formal parameter may be prefixed 
>>> with #, and we are free to use # in other ways elsewhere.
>>> 
>>> If # should be kept reserved even in this context, then perhaps something 
>>> like
>>> 
>>>   function f(args: x, y, z) {
>>>     // use x, y, z freely (they could be patterns)
>>>     switch (args.length) {
>>>       case 1: ...
>>>       case 2: ...
>>>       // etc.
>>>     }
>>>   }
>>> 
>>> The "label" names a rest parameter for the entire parameter list.
>>> 
>>> /be
>>>> Mark S. Miller <mailto:[email protected]>
>>>> November 10, 2013 6:52 PM
>>>> 
>>>> 1) "#" is one of the few ascii characters we haven't used up yet. Let's 
>>>> not use it up on a minor convenience.
>>>> 
>>>> 2) Introducing new syntax for use cases that are expected to be frequent, 
>>>> e.g., classes, often pays for its weight. The frequency makes it likely 
>>>> that readers will understand what it is the vast majority of times they 
>>>> encounter it. New syntax that gets used once in a blue moon can only be 
>>>> justified if the pain of doing without in those blue-moon cases is huge. 
>>>> In this case, it isn't. For those rare occasions when they see it, readers 
>>>> are much more likely to guess what "arguments.length" mean that this funny 
>>>> newfangled "#" thing.
>>>> 
>>>> Code is read much more often than it is written -- at least code that 
>>>> matters. Brevity is useful as a metric only to the degree that it serves 
>>>> as a proxy for cognitive load on the reader.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> -- 
>>>>     Cheers,
>>>>     --MarkM
>>>> 
>>>> _______________________________________________
>>>> es-discuss mailing list
>>>> [email protected]
>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>> Allen Wirfs-Brock <mailto:[email protected]>
>>>> November 10, 2013 7:12 PM
>>>> 
>>>> One of the the few remaining uses of a function's 'arguments' binding is 
>>>> to determine the actual number of passed arguments.  This is necessary in 
>>>> some overloading scenarios where a function has different behavior when an 
>>>> argument is completely absent then it has when undefined (or any other 
>>>> default value) is explicitly passed in that parameter position.  That 
>>>> situation occurs in a number of DOM APIs and even a few ES library 
>>>> functions.
>>>> 
>>>> For example(see https://bugs.ecmascript.org/show_bug.cgi?id=1877 ), 
>>>> Array.prototype.splice returns different results for:
>>>>    [1,2,3].splice()
>>>> and
>>>>    [1,2,3].splice(undefined)
>>>> 
>>>> The natural ES6 declaration for a splice function is:
>>>> 
>>>>    function splice(start, deleteCount, ...items) {...
>>>> 
>>>> but if you write it this way then within the body you have to have a test 
>>>> like:
>>>> 
>>>>     if (arguments.length == 0) {...
>>>> 
>>>> to implement the correct  web-compatable behavior.
>>>> 
>>>> Or, alternatively you could declare the functions as:
>>>> 
>>>> function splice(...actualArgs) {
>>>>      let [start, stop, ...item] = actualArgs;
>>>>      ...
>>>>      if (actualArgs.length == 0) {...
>>>> 
>>>> So, to implement a Web-compaable version of splice you either have to use 
>>>> 'arguments' to determine the actual number of passed objects or you need 
>>>> to declare it with a bogus parameter pattern and use explicit or implicit 
>>>> destructuring to parse out the positional parameters.
>>>> 
>>>> One way around this dilemma would be to provide a syntactic affordance for 
>>>> determing the actual argument count.  For example, one possibility would 
>>>> be to allow the last item of any formal parameter list to be an item of 
>>>> the syntactic form:
>>>> 
>>>>     ActualArgumentCount : '#' BindingIdentifier
>>>> 
>>>> So, the declaration for splice could then be:
>>>> 
>>>>    function splice(start, deleteCount, ...items, #argCount) {
>>>>       ...
>>>>       if (argCount == 0) {...
>>>> 
>>>> Thoughts?
>>>> 
>>>> Allen
>>>> 
>>>> 
>>>> _______________________________________________
>>>> es-discuss mailing list
>>>> [email protected]
>>>> https://mail.mozilla.org/listinfo/es-discuss
>> 
>> 
>> 
>> -- 
>>     Cheers,
>>     --MarkM
> 
> 
> 
> -- 
>     Cheers,
>     --MarkM
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to