<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Jul 10, 2011, at 3:51 PM, Rick Waldron wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">As a sidenote, but with regard to forEach, can someone point me to some documentation that explains why the generic form of forEach doesn't work with objects (the use case has sufficient history)<br></blockquote><div><br></div>You mean: why wasn't Array.prototype.forEach put on Object in the first place?</div><div><br></div><div>The array extras loop from 0 up to but not including this.length -- they're not enumerating properties. Enumeration of Array elements is unspecified and browsers behave differently (as for enumeration of indexed properties in non-Arrays, and of properties in general). Non-interoperation and no normative spec to appeal to, combined with the focus on Array not Object, kept forEach simple, and congruent to the other [0, this.length) indexing generics.</div><div><br></div><div>/be</div><div><br><blockquote type="cite"><br>Rick<br><br><span style="font-family:Prelude, Verdana, san-serif;"><br><br></span><span id="signature"><div style="font-family: arial, sans-serif; font-size: 12px;color: #999999;">-- Sent from my Palm Pre</div><br></span><span style="color:navy; font-family:Prelude, Verdana, san-serif; "><hr align="left" style="width:75%">On Jul 10, 2011 6:42 PM, David Bruant <<a href="mailto:david.bruant@labri.fr">david.bruant@labri.fr</a>> wrote: <br><br>
    Le 10/07/2011 22:46, Dmitry A. Soshnikov a écrit :
    <blockquote cite="mid:4E1A0F8A.9070206@gmail.com" type="cite">
      
      Here I put some extensions for arrays standard library (separated
      from this thread: <a moz-do-not-send="true" class="moz-txt-link-freetext" href="https://mail.mozilla.org/pipermail/es-discuss/2011-July/015856.html">https://mail.mozilla.org/pipermail/es-discuss/2011-July/015856.html</a>
      where Array.of and Array.from were considered).<br>
      <br>
      We can consider also the following (as a first step):<br>
      <br>
      <b>- Array.prototype.remove(value, all)</b><br>
      <br>
      [1, 2, 3, 2].remove(2); // [1, 3, 2]<br>
      [1, 2, 3, 2].remove(2, true); // [1, 3]<br>
      <br>
      (seems this function is required more than Array.of, because at
      least I saw it implemented in all frameworks and used it myself).<br>
      <br>
      <b>- Array.prototype.subtract(array)</b><br>
      <br>
      [1, 2, 3, 4].subtract([2, 4]); // [1, 3]<br>
      <br>
      <b>- Array.seq(from, to)</b> // or Array.range(from, to)<br>
      <br>
      Array.seq(1, 5); // [1, 2, 3, 4, 5]<br>
      <br>
      <b>- Array.build(n, fn)</b><br>
      <br>
      Array.build(5, function(index) index + 1); // [1, 2, 3, 4, 5]  <br>
      <br>
      <b>- Array.min(array), Array.max(array)</b> (can be implemented
      with Math.max/min and apply though)<br>
      <br>
      Array.min = (array) -> Math.min.apply(Math, array)<br>
      <br>
      <b>- Array.prototype.split(n)</b><br>
      <br>
      ["a", "b", "c", "d", "e"].split(3) // [["a", "b", "c"], ["d", "e",
      "f"]]<br>
      <br>
      Perhaps even to build objects from lists of keys and values (this
      function is usually called as `zip`):<br>
      <br>
      <b>- Object.fromArrays(["a", "b", "c"], [1, 2, 3]);</b> // {a: 1,
      b: 2, c: 3}<br>
      <br>
      <b>- Array.prototype.unique</b><br>
      <br>
      [1, 3, 2, 5, 5, 3].unique(); // [1, 3, 2, 5]<br>
      <br>
      Thus, all names of methods can be discussed.<br>
    </blockquote>
    I like a lot all of these ideas, but I can't help thinking that they
    do not seem to be aligned with the initial ECMAScript array design
    which is that arrays are ECMAScript objects (which is very different
    from what we'd understand of "array" in C or "lists" in Erlang as
    you cite them).<br>
    The question I ask for each of your Array.prototype ideas is "how
    does it apply to non-dense arrays?".<br>
    <br>
    Creating a List or a DenseArray (or both?) type sounds to better
    capture your intentions (especially since you provided a link to
    Erlang "list" methods). It could inherit everything from
    Array.prototype for free.<br>
    Actually, this could be implemented with proxies :-)<br>
    <br>
    Since we're suggesting array additions, I would be interested in
    trying to address one issue of forEach, map, every, some and filter.<br>
    They all have a well-defined algorithm. Consequently, if the
    callback function has side-effects, these are deterministic. This,
    however, prevent efficient (parallelized, for instance)
    implementation. This is unfortunate since in a lot of cases, people
    don't do side-effect and would certainly trade the side-effect
    determinism guarantee for performance.<br>
    Could it be considered to add non-deterministic versions of these
    functions? They would be defined like Array.prototype.sort is, in
    terms of guarantees (like "the callback function will be called at
    most once on which array element" for 'every' and 'some' for
    instance) rather than with an algorithm.<br>
    I have no strong opinion on how to name them. Maybe adding an N (for
    "Non-deterministic") at the end of the equivalent method
    (Array.prototype.forEachN, Array.prototype.mapN, etc.)?<br>
    <br>
    David<br>
  

</span>
_______________________________________________<br>es-discuss mailing list<br><a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>https://mail.mozilla.org/listinfo/es-discuss<br></blockquote></div><br></body></html>