On Nov 10, 2013, at 11:44 AM, Mark S. Miller 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.
Hence my choice of using # which is more suggestive to the meaning. It seems suggestive enough that once somebody was initially exposed to it they would understand it when they say it. > > 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. But sometimes syntax to provide access to basic information or functionality that is rarely used. Arguably 'arguments' already provides such a hook but we are trying to generally discourage use of 'arguments' because of its other undesirable characteristics. A different alternative would be via a new default bind. We could specify that every function has an implicit const bind for 'actualArgCount' (unless there is a different explicit declaration for that name). As for rarity. I've been in enough long discussions with Web API folks on the public-script-coord list and on various WebIDL bugs to feel that this usage to define over-loads isn't that rare in the DOM API world. It would be nice for ES to have a story for handling such definitions other than falling back to using 'arguments' Allen > > > > > On Sun, Nov 10, 2013 at 11:08 AM, Brendan Eich <bren...@mozilla.com> 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:erig...@google.com> > 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 > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss > Allen Wirfs-Brock <mailto:al...@wirfs-brock.com> > 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 > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss > > > > -- > Cheers, > --MarkM
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss