On 16/07/2012 6:33 AM, Benjamin Striegel wrote:
This feels simpler, yes. But as long as we're talking about
presentation, would it be possible to establish standard terminology to
distinguish between dynamically-sized vectors and fixed-length vectors?
People will tend to simply refer to both as "vectors" or "vecs", and
confusion will result. It really doesn't matter what the final terms
are, as long as they're distinct and easy to type.
Possibly. But I don't think an additional term here will really help; I
think Patrick's right on the money by comparing this to C and seeking to
_minimize_ the presentation of variety at work in the model. Consider C
seriously here. Would you say it has "fixed size" and "dynamic sized"
array types? I mean, it kinda does: T[10] is a type (fixed) and *T is a
type (dynamic), but T[] is ... a bit less than a type:
$ cat >t.c
int main() {
int x[];
}
^D
$ cc t.c
t.c: In function main:
t.c:2: error: array size missing in x
You can't quite use it in places where a definite amount of allocated
memory is expected; at least not without "implicitly" giving the size:
$ cat >t.c
int main() {
int x[] = {1,2,3,4};
}
^D
$ cc t.c
$
And in most contexts (assignment to another value, passing to a
function) it tends to drop the definite size and decay to a pointer,
albeit a "narrow" one without bounds checks. Yet users mostly come to
terms with this: once they have a mental model of which allocations are
contained in others and which are pointers, the rules of the array types
become (mostly) obvious consequences.
I'd say we're following pretty much the same model, except we're
maintaining the difference between a vec-pointer and an element-pointer,
refusing to decay between the two, and the vec-pointer carries a bound
so it can be bounds-checked. This is healthy! Randomly indexing
element-pointers and hoping you stay in-bounds in C is the main source
of memory errors there :)
Our vectors aren't really "fixed-size" or "dynamic-size"; just the
static types. All vectors are _some_ size, it's just that in some
contexts (those where the vec is stored in the interior of some other
allocation, including a stack frame) the user has to specify the size
statically as part of a variable's type; whereas in others (heap
allocations, allocations held in other frames and passed by pointer,
etc.) the variable is a pointer so it doesn't have to statically encode
the size of its pointee: all pointers are the same size (1 or 2 words,
depending on whether bounds-checked) so allocating the variable is just
allocating a pointer.
-Graydon
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev