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