On Jul 10, 2011, at 3:51 PM, Rick Waldron wrote:

> 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)

You mean: why wasn't Array.prototype.forEach put on Object in the first place?

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.

/be

> 
> Rick
> 
> 
> 
> -- Sent from my Palm Pre
> 
> On Jul 10, 2011 6:42 PM, David Bruant <david.bru...@labri.fr> wrote: 
> 
> Le 10/07/2011 22:46, Dmitry A. Soshnikov a écrit :
>> 
>> Here I put some extensions for arrays standard library (separated from this 
>> thread: https://mail.mozilla.org/pipermail/es-discuss/2011-July/015856.html 
>> where Array.of and Array.from were considered).
>> 
>> We can consider also the following (as a first step):
>> 
>> - Array.prototype.remove(value, all)
>> 
>> [1, 2, 3, 2].remove(2); // [1, 3, 2]
>> [1, 2, 3, 2].remove(2, true); // [1, 3]
>> 
>> (seems this function is required more than Array.of, because at least I saw 
>> it implemented in all frameworks and used it myself).
>> 
>> - Array.prototype.subtract(array)
>> 
>> [1, 2, 3, 4].subtract([2, 4]); // [1, 3]
>> 
>> - Array.seq(from, to) // or Array.range(from, to)
>> 
>> Array.seq(1, 5); // [1, 2, 3, 4, 5]
>> 
>> - Array.build(n, fn)
>> 
>> Array.build(5, function(index) index + 1); // [1, 2, 3, 4, 5]  
>> 
>> - Array.min(array), Array.max(array) (can be implemented with Math.max/min 
>> and apply though)
>> 
>> Array.min = (array) -> Math.min.apply(Math, array)
>> 
>> - Array.prototype.split(n)
>> 
>> ["a", "b", "c", "d", "e"].split(3) // [["a", "b", "c"], ["d", "e", "f"]]
>> 
>> Perhaps even to build objects from lists of keys and values (this function 
>> is usually called as `zip`):
>> 
>> - Object.fromArrays(["a", "b", "c"], [1, 2, 3]); // {a: 1, b: 2, c: 3}
>> 
>> - Array.prototype.unique
>> 
>> [1, 3, 2, 5, 5, 3].unique(); // [1, 3, 2, 5]
>> 
>> Thus, all names of methods can be discussed.
> 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).
> The question I ask for each of your Array.prototype ideas is "how does it 
> apply to non-dense arrays?".
> 
> 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.
> Actually, this could be implemented with proxies :-)
> 
> Since we're suggesting array additions, I would be interested in trying to 
> address one issue of forEach, map, every, some and filter.
> 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.
> 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.
> 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.)?
> 
> David
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss

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

Reply via email to