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

