D - language definition unfit for 64bit platforms
- Andreas Kaiser (41/41) Jun 01 2004 Problem:
- Daniel Horn (8/59) Jun 01 2004 I agree arrays should be allowed to be larger on 64 bit platforms
Problem:
In the current language definition, the data type of an
non-associative array index is fixed to int and uint, mostly implied
by context and not explicitly mentioned. But "foreach" is explicitly
defined this way. The portability guide recommends using size_t, but
I'm certain we'll see an ugly mix of ints, longs and size_t in
declarations and use all over the place.
While a 64bit implementation could bend the language definition by
unconditionally substituting long/ulong for the index type breaking
"foreach" compatibility, I recommend a different approach which also
allows for important type checks in those critical areas.
I'd guess we'll need a few compiler warnings come up at that time,
like it or not... but it's really nice to see some diagnostics if an
int is used for an array having its index specifically declared to be
a long thereby signalling that an int is not sufficient.
Unconditionally having all arrays indexed by long does not allow for
such diagnostics.
Proposal:
(a) The index data type should be part of the array declaration,
defaulting to int. Example:
double[int] a; // same as double[] a;
byte[long] b;
This is consistent with the syntax used for associative arrays. Any
integral data type should be allowed, because together with enums like
enum Tag ( A,B,C };
char[][Tag] tag2text;
we also get an additional level of compile time check as an accidental
use of plain integers yields errors.
(b) To ease generic code, there should be a way to use foreach without
having secret knowledge of both the array element type and the index
data type. Something like
foreach (indextypeof(a) i, elementtypeof(a) x; a) { ... }
instead of
foreach (int i, double x; a) { ... }
foreach (char[] i, byte x; b) { ... }
depending on what kind of array it is. For the index type some new
language item might be necessary. For the element data type I'm
uncertain as typeof(*a) seems to work at the moment whereas
typeof(a[]) does not, but this is probably not intentional and
certainly not nice.
Gruss, Andreas
Jun 01 2004
I agree arrays should be allowed to be larger on 64 bit platforms
but it's also nice to have 32 bit arrays that you know won't be 64
bit... your solution seems to address these concerns.
however I'd like to inform you that the newsgroup to which you posted is
obsolete. I'm replying to both D and digitalmars.D so your post gets
some face-time.
-Daniel
Andreas Kaiser wrote:
Problem:
In the current language definition, the data type of an
non-associative array index is fixed to int and uint, mostly implied
by context and not explicitly mentioned. But "foreach" is explicitly
defined this way. The portability guide recommends using size_t, but
I'm certain we'll see an ugly mix of ints, longs and size_t in
declarations and use all over the place.
While a 64bit implementation could bend the language definition by
unconditionally substituting long/ulong for the index type breaking
"foreach" compatibility, I recommend a different approach which also
allows for important type checks in those critical areas.
I'd guess we'll need a few compiler warnings come up at that time,
like it or not... but it's really nice to see some diagnostics if an
int is used for an array having its index specifically declared to be
a long thereby signalling that an int is not sufficient.
Unconditionally having all arrays indexed by long does not allow for
such diagnostics.
Proposal:
(a) The index data type should be part of the array declaration,
defaulting to int. Example:
double[int] a; // same as double[] a;
byte[long] b;
This is consistent with the syntax used for associative arrays. Any
integral data type should be allowed, because together with enums like
enum Tag ( A,B,C };
char[][Tag] tag2text;
we also get an additional level of compile time check as an accidental
use of plain integers yields errors.
(b) To ease generic code, there should be a way to use foreach without
having secret knowledge of both the array element type and the index
data type. Something like
foreach (indextypeof(a) i, elementtypeof(a) x; a) { ... }
instead of
foreach (int i, double x; a) { ... }
foreach (char[] i, byte x; b) { ... }
depending on what kind of array it is. For the index type some new
language item might be necessary. For the element data type I'm
uncertain as typeof(*a) seems to work at the moment whereas
typeof(a[]) does not, but this is probably not intentional and
certainly not nice.
Gruss, Andreas
Jun 01 2004








Daniel Horn <hellcatv hotmail.com>