<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Sep 29, 2011, at 12:14 PM, Sean Eagan wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>On Thu, Sep 29, 2011 at 1:31 PM, Allen Wirfs-Brock<br><<a href="mailto:allen@wirfs-brock.com">allen@wirfs-brock.com</a>> wrote:<br><blockquote type="cite"><br></blockquote><blockquote type="cite"><font class="Apple-style-span" color="#144FAE"><font class="Apple-style-span" color="#006312">...</font></font></blockquote><br><blockquote type="cite">I haven't written the spec. for spread in argument lists but clearly interior holes need to be passed as undefined.  Trailing holes in a spread in the final argument position could be trimmed but that would mean that:<br></blockquote><br>So you don't think holes should appear in rest parameters or<br>`arguments` ?  The only reason I can think of to require that is that<br>old code may expect `arguments` not to contain holes, but then it<br>could be spec'ed that holes only appear in rest parameters.  Beyond<br>that is seems like it would make sense to be consistent with array<br>literal hole preservation.<br></div></blockquote></div><div><br></div><div><br></div>No I don't. Currently there is no ways to syntactically generate an actual argument list with holes and I think that allowing ,, in argument lists is not particularly desirable. Also apply replaces holes with undefined so there is currently no way to create an arguments object that initially contains holes (somebody could delete elements after  it was created).  It seems highly desirable that we preserve the existing semantics of arguments and that:<div>   function foo(...args) {</div><div>      assert(length.arguments === length.args};</div><div>      for (let i in arguments) assert(arguments.hasOwnProperty(i) === args.hasOwnProperty(i) && arguments[i] === args[i]);</div><div>   }</div><div><br></div><div>regardless of how foo was called.  In other words,  baz(...bar) and baz.apply(undefined,bar) should always produce the same effect.</div><div><br></div><div>Also, note that I've currently spec'd ES6 so that 'arguments' can be used as a rest parameter name.  In other words</div><div>   function foo(...args) {return args}</div><div>and</div><div>  function foo(...arguments) {return arguments}</div><div>are semantically equivalent.</div><div><br></div><div>I did this to  enable to make it easier to migrate code  such as:</div><div>   function foo() {baz(arguments)}</div><div>to</div><div>   function foo(...arguments) {baz(arguments)}</div><div><br></div><div>allen</div><div><br><div><br></div></div></body></html>