On Aug 28, 2011, at 4:36 PM, Allen Wirfs-Brock wrote:

> On Aug 27, 2011, at 6:12 AM, Andreas Rossberg wrote:
> 
>> On 27 August 2011 00:34, Allen Wirfs-Brock <[email protected]> wrote:
>>> If the formal parameter list includes any non-optional, non-rest formal
>>> parameters, the length is the total number of non-optional/non-rest formal
>>> parameters.
>>> For example:
>>>    function bar(a,b,c) {} //bar.length=3
>>>    function baz(a,b,c=0) {} //baz.length=2
>>>    function bam(a,b,c=0,...d) {} //bam.length==2   BTW, is this legal?
>> 
>> Makes sense. (And yes, I don't see why the latter shouldn't be legal.)
> Because the is a  potential for misinterpreting the user intent on such a 
> call.  For
>    bam('a','b',1,2,3) 
> we surely have to interpret the argument/parameter mapping as:
>     a='a',b='b',c=1,d=[2,3] 
> but it is easy to imagine a programmer intending
>     a='a',b='b',c=0,d=[1,2,3] 
> Making it illegal to have a formal parameter list that has both optional and 
> result parameters might result the likelihood of that confusion,  

That's too restrictive. There are lots of ways to go wrong in JS, we don't try 
to put programmers in a five-point harness.

Python:

>>> def foo(a,b,c=1,*d):
...   print(a, b, c, d)
... 
>>> foo(0,1,2,3,4)
0 1 2 (3, 4)
>>> foo(0,1,2,3)
0 1 2 (3,)
>>> foo(0,1,2)
0 1 2 ()
>>> foo(0,1)
0 1 1 ()

(Python reflects rest params [splats] as tuples not lists.)

Ruby is of course pretty similar:

def foo(a,b,c=1,*d)
  print a, b, c, d, "\n"
end
foo(0,1,2,3,4)
foo(0,1,2,3)
foo(0,1,2)
foo(0,1)
^D
01234
0123
012
011

(My Ruby REPL skills are sad -- ugly run-together stdout follows the TTY EOF ^D 
above.)


>>> If there are no non-optional or non-rest formal parameters the length is 1.
>>>    function bar1(a=0) {} //bar1.length=1
>>>    function baz1(a=0,b=1,c=2) {} //baz1.length=1
>>>    function bam1(...a) {} //bam1.length==1
>> 
>> I'm not so sure about this, it seems incoherent. Why not 0, especially
>> for the first two? You mentioned builtins like Array above, but I
>> would rather count them as the exception to the rule (especially given
>> that the builtins don't seem entirely consistent wrt length anyway).
> 
> In my proposal, I am decided to make a clear distinction between truly empty  
> formal parameter lists and  those with only various forms of optional formal 
> parameters by only giving a 0 length to the empty formals case.  That's a 
> debatable decision but it seems desirable to distinguish the two cases and 
> the built-ins is the only precedent that we have to follow.

You make a distinction but create an ambiguity between

function foo(a=0)... // length 1
function bar(a=0,b=1) // length 1

That seems no more consistent (and less coherent as Andreas put it). If 
trailing optional parameters do not contribute to length, then we have a 
consistent single rule for length. That it does not match all built-ins is sad 
history, not to be rewritten lightly but not to overdetermine the future.


> I'm not sure if there is any real use case for the length property of 
> ECMAScript functions.  Does anybody know of one? Regardless, I do think we 
> can get rid of it.

Working on instrumentation to find uses on the web. More in a bit,

/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to