Brendan Eich wrote:
I agree that * or other operators should not be naively supported on
arrays, which are not value objects in any case. Any vector or matrix
value object would want sweet literal syntax, but it wouldn't be array
literal syntax, exactly.
Just to elaborate on this. The syntax for vector and matrix literals
would not be
let v = [0, 1, 2, 3];
let m = [[a, b, c, w], [d, e, f, x], [g, h, i ,y], [j, k, l, z]];
since arrays are not value objects, and nested arrays are not 2d matrices.
Rather, we'd have something like
let v = vector([0, 1, 2, 3]);
let m = matrix([[a, b, c, w], [d, e, f, x], [g, h, i ,y], [j, k, l, z]]);
or even (macros for new syntax)
let v = #vec[0, 1, 2, 3];
let m = #mat2d[[a, b, c, w], [d, e, f, x], [g, h, i ,y], [j, k, l, z]];
Or something even prettier. The point is that the new literal and
operator forms would be lexically scoped hygienic macros, or built-ins
prefiguring same that could be recast as macros later.
Then having operators just work on v and m would follow and not
interfere with or affect any code not in scope.