@IanM
I would prefer the 'as reference' modifier to 'byref', i.e.
a as array of integer
b as float
// resize it etc
doWop( a, b )
function doWop( j as array of integer as reference, k as float as reference )
j[0] = 1337
endFunction
Sure it makes the code rather long, but I think it's best to avoid abbreviations when dealing with things the user cannot rename, and makes it more apparent what's going on. Plus, most of the time the user won't even want references, so the average code should remain unchanged.
I also think all data types should be passed as a copy by default, I'm aware that many similar languages pass almost everything by reference, but this can be incredibly confusing without any 'const' system. If everything's a copy by default then the system would remain more consistent and there would be far less beginners making code that breaks. The worst that happens is that people write slow code, but find they can fix it by adding 2 words, I think the trade off is better.
I also don't see the problem with allowing variable declaration by assignment as shown in the OP, i.e. 'a as integer' would be identical to 'a = 0'. Otherwise 'for i = 1 to 10' would be an exception, and I don't think integers should be some magical special case.
As for arrays, I'm leaning toward removing the ability to define their size on definition, because it means there would be a syntax difference between declaring one and declaring one as a function argument.
Something like this seems clearer:
grid as Array of Integer
ResizeArray( grid, 5 ) // 1D 5 elements(1-5)
grid[1] = 5
ResizeArray( grid, 5, 5 ) // 2D 5x5
grid[1, 1] = 6
ResizeArray( grid, 5, 5, 5 )
grid[1, 1, 1] = 7 // 3D 5x5
I don't think there should be a way to discriminate the amount of dimensions or the size of the array when passed to a function, because that would require arguments be formatted like: 'a as Array of Float[,,]', which doesn't seem very consistent with anything else in the language, i.e. there is no ability to call functions with 'plop(,,)' to use default values or something, so why should arrays be any different?