> new Vector.<T> ( length=..., fixed=... )

It would be helpful for readability to have the types here.

> The |Vector| constructor is implementation-defined.

This is misleading.  Usually when a standard states that something is 
implementation-defined, it means that its semantics are not specified in the 
standard.  Having no standard-defined vector constructor would be strange 
indeed.

If you merely don't want to write pseudo-code for the Vector constructor, 
please just omit the "Implementation" section.


> Vector( object )

> When the |Vector| class object is called as a function, it creates a new 
> variable-length |Vector| object of type |*| ...
> 
> static meta function invoke(object) {
>     if (object is Vector.<*>)
>         return object;

The description and code don't match.

[Also, I'm a bit unclear about how parametrized types currently work.  The 
overview document has examples that seem to indicate that you call bound types 
as functions.  What happens when you call Vector.<Foo> as a function and pass 
it a Vector.<Bar>?]


toLocaleString:  This seems overspecified.  Do you want to explicitly define 
what happens if the vector is modified in the middle of running this?


concat:

Vector<X> cannot be a subtype of Vector<Y> even if X is a subtype of Y.  If it 
were, the type system would be unsound:  you could pass a Vector<X> to a 
function F expecting a Vectory<Y> and then have F write a Y into that vector.


every, filter, etc.:  These seem overspecified.  For example, the definition of 
filter states that the implementation must perform the lookup and fetch of each 
found element twice, which unnecessarily forbids more efficient implementations.


forEach:  Why is clamp here?


"The static indexOf method ...":  indexOf isn't a static method.

Why does indexOf return AnyNumber?


lastIndexOf:  What happens when you do i-- on a uint with the value of 0?  Do 
you get 4294967295?


sort:  Doesn't return anything.


splice:
>     if (items.length < delcnt) {
>         let shift = delcnt - items.length;
>         for ( let n=0, i=first; n < shift ; n++, i++ )
>             this[i] = this[i+shift];
>         length -= shift;
>     }
>     else {
>         let shift = items.length - delcnt;
>         for ( let n=shift-1, i=first+shift; n >= 0 ; n--, i-- )
>             this[i] = this[i-shift];
>     }

Both of these seem wrong.  I think there are at least four different errors 
here.


unshift:

Need to raise length first.

>     for ( let i=0 ; i < numitems ; i++ )
>         this[newlimit-i] = this[oldlimit-i];

The bounds on this loop are wrong.


1.4:  Typo:  "defined on directly on"


When you iterate through Maps, you get the old length if the Map is modified 
during the iteration.  When you iterate through Vectors, you get the new 
length.  The discrepancy seems jarring.


fixed should be a constant property or be removed altogether.  It's useless as 
a variable -- anybody can change the length of the vector at any time anyway, 
and now code that hands out references to vectors to clients has to deal with 
bozos who make those vectors fixed just for grins.


What happens if you try to index a vector with +Infinity or NaN?  I assume it's 
RangeError, but don't know enough about how numerically named properties work.


> prototype function every(this:Vector.<*>, checker, thisObj=undefined)
>     (this.intrinsic::every(checker, thisObj is Object) ? thisObj : null);
> 
> prototype function filter(this:Vector.<*>, checker, thisObj=undefined)
>     (this.intrinsic::filter(checker, thisObj is Object) ? thisObj : null);
> 
> prototype function forEach(this:Vector.<*>, eacher, thisObj=undefined)
>     (this.intrinsic::forEach(checker, thisObj is Object) ? thisObj : null);

Why are you passing a boolean as the thisObj argument to intrinsic::every et 
al.?


    Waldemar
_______________________________________________
Es4-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es4-discuss

Reply via email to