Couldn’t this be handled by pattern matching? Two steps would be necessary to 
do so (I know that the second one is controversial, but hear me out).

First: introduce a pattern matching construct.

```js
function splice(...args) {
    match(args) {
        case [start, stop, ...item]:
            ...
        case []:
            ...
    }
    ...
}
```

Second: Matching an array fails if the right-hand side does not have the 
correct length. Two arguments in favor of this approach:
– If you want things to be more lenient, you can always use the rest operator.
– To me (subjectively), it feels cognitively right. Matching against [x, y] 
seems fundamentally different from matching against { 0: x, 1: y }. In the 
former case, length and order of elements matters, in the latter case, it 
doesn’t.

The neat things is that #2 would also enable the enforcement of an arity:

function foo(args) {
    let [must, have, four, params] = args;  // exception if arity != 4
}

On 11 Nov 2013, at 2:12 , Allen Wirfs-Brock <al...@wirfs-brock.com> wrote:

> 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

-- 
Dr. Axel Rauschmayer
a...@rauschma.de

home: rauschma.de
twitter: twitter.com/rauschma
blog: 2ality.com



_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to