On 05/28/2010 01:20 PM, Brendan Eich wrote:

That said, I'm not sure I understand why this should gate anything in
this thread. Value types should be frozen (shallowly immutable)
regardless, or other things break, e.g., they could no longer be
transparently passed by copy. C# got this wrong, and paid a semantic
complexity price we must avoid. Non-frozen structs should not be value
types. Frozen structs could be value types, or could be wrapped in
value types or something.

Agreed. Sam?

There are so many undefined terms in that paragraph that I don't know what I would be agreeing to.

For example, I don't know why the word "shallowly" was inserted there. Was that just reflex, or is there an actual requirement to allow object references inside a struct? Looking at the syntax that Brendan put out for discussion purposes, it isn't clear to me how one would do that.

const TA =
    Array.newTypedArray(fixed_length,
                        Object.newStructType({x:"u32", y:"u32", z:"u32",
                                              r:"u8", g:"u8", b:"u8", a:"u8"}));
let a = new TA(...);

Mark mentions passed by copy. What happens if I pass a[1] as an parameter on a method call? Does something semantically different happen if the struct is frozen vs non-frozen? Is that complexity worth it?

Putting that aside for the moment, my more specific questions is: under what conditions would it ever be possible for a[1]===a[2] to be true?

There is much wrapped in that simple question. I'm inferring a lot from the discussion: "typed arrays" have a fixed number of elements, each of which has a fixed length. It should be possible for implementations to store entire arrays in contiguous storage.

As such, a[1] and a[2] in a typed array can never be the same object. Which means that they can never be ===, much less egal. By contrast, they could conceivably be the same object in a "classic" Array, depending on how they were constructed.

To facilitate discussion, I toss out the following:

  var a = new Array();
  a[0] = "a";
  a[1] = "ab";
  a[0] += "b";

  if (a[0] === a[1]) { ... }

To the casual developer, I will assert that the fact that these strings are treated as being equal is an indication that they have the same value (i.e., sequence of bits) and not an indication that they occupy the same storage location (which could conceivably be true, but that's not generally something the implementation directly exposes).

The real question here: are what is currently being called a struct more like a bit string with convenient methods of accessing slices, or are they more like objects where no matter how close the sequence of bits are, two objects in different locations are never the same.

It might very well be that the requirements are such that the final conclusion will reluctantly be that it isn't worth trying to make === have a sane definition for these structs. That just isn't something I would expect as a starting position.

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

Reply via email to