digitalmars.D - Pragma for default literal type?
- Norbert Nemec (46/46) Apr 03 2005 Hi there,
- =?ISO-8859-15?Q?Anders_F_Bj=F6rklund?= (37/61) Apr 03 2005 You could also add these Unicode types to the mess:
- =?ISO-8859-15?Q?Anders_F_Bj=F6rklund?= (5/8) Apr 03 2005 Oops, seems I made a small copy-and-paste error:
Hi there, the idea was brought up by Georg Wrede in the "80 bit challenge" thread, but I think it is more general: Why not generalize the behavior of types and literals: * have types of exactly-defined size/precision * alternatively have types that default to the optimum size/precision of the platform * have suffixes for literals to specify exact precision * have literals without suffix result in the default type Now, the mapping between the default type and the exact precision should be done by the implementation, but there should be a pragma to change it by hand. The details of the naming are a secondary topic. The following has been proposed, discussed and rejected over and over again. Still, together with the idea of making the mapping configurable via a pragma and coupling it with the default size of literals, it might be interesting to reconsider. I would still propose to clean up the mess of C types completely and start from scratch: int8, int16, int32, int64, int128 uint8, uint16, uint32, uint64, uint128 float32, float64, float80, float128 ifloat32, ifloat64, ifloat80, ifloat128 cfloat32, cfloat64, cfloat80, cfloat128 No further explanation necessary. Any programmer coming from whatever language will understand intuitively without consulting a manual. (One has to be aware that cfloat32 has actually 64 bits, but that matter is awkward no matter which way you put it.) The "optimum-size" types: int, real, imaginary, complex As said, the mapping between optimum-size types and exact-size types is given by default by the compiler, but there should be a pragma to fix it on a per-source-file basis. The fixed-size types might look ugly like hell, but they are not supposed to be used a lot, except in places where you need to be aware of exact bit-sizes. Most code will only deal with the optimum-size types, which is easy to be remapped if you need to work around compatibility issues. This solution will do away with the awkward historical short/int/long and float/double/long-double confusion without just running into another confusion. Compatibility with existing D code might break in some places but not badly. Porting C code should not be a problem: int in C never was cleanly defined, so any code depending on a fixed size was broken anyway. float and double simply don't exist anymore, so you either define an alias or replace them by "real".
Apr 03 2005
Norbert Nemec wrote:The details of the naming are a secondary topic. The following has been proposed, discussed and rejected over and over again. Still, together with the idea of making the mapping configurable via a pragma and coupling it with the default size of literals, it might be interesting to reconsider. I would still propose to clean up the mess of C types completely and start from scratch: int8, int16, int32, int64, int128 uint8, uint16, uint32, uint64, uint128 float32, float64, float80, float128 ifloat32, ifloat64, ifloat80, ifloat128 cfloat32, cfloat64, cfloat80, cfloat128You could also add these Unicode types to the mess: utf8, utf16, utf32 BTW: Have you looked at the DMD source code yet ? You might want to peek at "dmd/mars.h"... :-)No further explanation necessary. Any programmer coming from whatever language will understand intuitively without consulting a manual. (One has to be aware that cfloat32 has actually 64 bits, but that matter is awkward no matter which way you put it.)I made a half-hearted attempt to reuse the stdint types for floating point types too, but withdrew it again... See http://www.prowiki.org/wiki4d/wiki.cgi?StdTypeAliases It just seemed like too many people hated the _t suffix ?The "optimum-size" types: int, real, imaginary, complexThat should probably just be "integer", to avoid a couple of decades of confusion on the matter ? (just as real could also be "floating" or something) You also have the "types": size_t and wchar_t, too ? (linking to uint/ulong and wchar/dchar, respectively, alias target depending on what the target ABI/API is) version (X86) alias ulong size_t; else version (AMD64) alias uint size_t; else static assert(0); version (Win32) alias wchar wchar_t; else version (linux) alias dchar wchar_t; else static assert(0); D currently uses the CPU and OS here (a mistake, IMHO, as it should instead be all about the ABI and the API...)Compatibility with existing D code might break in some places but not badly. Porting C code should not be a problem: int in C never was cleanly defined, so any code depending on a fixed size was broken anyway. float and double simply don't exist anymore, so you either define an alias or replace them by "real".These are (IMHO) the D names-du-jour, for the above list: byte, short, int, long, cent ubyte, ushort, uint, ulong, ucent float, double, extended, quadruple ifloat, idouble, iextended, iquadruple cfloat, cdouble, cextended, cquadruple char, wchar, dchar Mapping these two sets could be given as a quiz... ;-) (probably right after the Mars/Phobos/Deimos question) As long as the irreal and cereal types dies, all's well... (but I do not like the proposed number suffixes myself, at least not as the primary type names? I'm too used to C/Java) --anders
Apr 03 2005
version (X86) alias ulong size_t; else version (AMD64) alias uint size_t; else static assert(0);Oops, seems I made a small copy-and-paste error: version (X86) alias uint size_t; else version (AMD64) alias ulong size_t; else static assert(0); --anders
Apr 03 2005