digitalmars.D - typedef keyword?
- bearophile (8/8) Oct 20 2010 In D.learn I have just given an answer about alias/typedef, in it I have...
- Antony (4/4) Oct 20 2010 It looks like a good idea.
- %u (10/10) Oct 20 2010 == Repost the article of Antony (antonynoha@yahoo.com)
- Michel Fortin (32/32) Oct 20 2010 Personally, one thing I've used typedef for is for creating type-safe
- F.Almeida (27/35) Oct 21 2010 Extensions to turn typedef into a more useful construct have already
- Andrej Mitrovic (39/74) Oct 21 2010 I recently had a good use for a typedef. I was interfacing with some C
In D.learn I have just given an answer about alias/typedef, in it I have said that the decision to deprecate typedef was in the end the right one: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=22387 But once some time is passed, what do you want to do with the typedef keyword? Just remove it and turn its usage in a syntax error? Keep in mind that the original purpose of typedefs in D was not imaginary, it was present to help a real need. If you program a little in Pascal/ObjectPascal/Ada you quickly learn that a typedef is useful. So in my opinion a better solution is to design a better typedef, that uses the "typedef" keyword, and supports a more flexible semantics, as Andrei has suggested. This new usage of the "typedef" keyword may even be introduced in D3, there's no need to rush. The usage of "alias this" in structs will help, but a new usage of the typedef keyword may be syntax sugar for something else defined in Phobos. This new syntax of typedef may require a () after the keyword, to give space to specify the alternative kinds of typedef: typedef(subtype) ... ... The syntax typedef(...) is (I think) not syntactically compatible with C, so there is no problem with introducing a similar syntax with different semantics (this is even an improvement over D1, where typedef acts unlike C language). Bye, bearophile
Oct 20 2010
It looks like a good idea. I program sometimes in Ada and i would be glad to see similar features in D as well. ---------------------------- 1) in Ada: type SomeType is
Oct 20 2010
== Repost the article of Antony (antonynoha yahoo.com) == Posted at 2010/10/20 20:43 to digitalmars.D It looks like a good idea. I program sometimes in Ada and i would be glad to see similar features in D as well. ---------------------------------------------------------------------- 1) in Ada: type... in D: typedef... (Note: would be very useful) 2) in Ada: subtype... in D: alias... (Note: is useful) ----------------------------------------------------------------------
Oct 20 2010
Personally, one thing I've used typedef for is for creating type-safe bindings for libraries in other languages. For instance, this C/C++ idiom: typedef struct A A; essentially creates an undefined type, an opaque type that you can neither create nor access except through functions that knows about the definition of struct A. It's more often used with pointers and functions passed to and from functions: A *createA(); void cookA(A *a); void deleteA(A *a); But because it's declared but undefined. you can't allocate your own and pretend it's the right thing. This doesn't compile in C/C++: A *a1 = malloc(sizeof(A)); A *a2 = new A; This C/C++ code won't compile, and it mustn't because that's an opaque type. Now, how do you allow the former (functions createA, cookA, deleteA) while disallowing the later (allocating your own A)? In the past in D I used typedef to do that. typedef void A; typedef void B; Using typedef instead of alias prevents assignments of one pointer type to another while giving the desirable properties of an opaque type. I'm not sure how to do that now without typedef: you can't declare a struct without defining it in D, so you can't prevent that dummy struct from being created and allocated and later passed to functions in your bindings, so there's no hope for make the such binding APIs compatible with SafeD. -- Michel Fortin michel.fortin michelf.com http://michelf.com/
Oct 20 2010
Extensions to turn typedef into a more useful construct have already been proposed, but discussion on this has not evolved much since. My first, naive, idea was shown here: http://www.digitalmars.com/webnews/newsgroups.php? art_group=digitalmars.D&article_id=114489 Both the syntax and the rules to enforce casting would need some work, but the basic idea is give the programmer control over which types such a variable can cast to and from. == Quote from bearophile (bearophileHUGS lycos.com)'s articleIn D.learn I have just given an answer about alias/typedef, in itI have said that the decision to deprecate typedef was in the end the right one:http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=22387But once some time is passed, what do you want to do with thetypedef keyword? Just remove it and turn its usage in a syntax error? Keep in mind that the original purpose of typedefs in D was not imaginary, it was present to help a real need. If you program a little in Pascal/ObjectPascal/Ada you quickly learn that a typedef is useful.So in my opinion a better solution is to design a better typedef,that uses the "typedef" keyword, and supports a more flexible semantics, as Andrei has suggested. This new usage of the "typedef" keyword may even be introduced in D3, there's no need to rush. The usage of "alias this" in structs will help, but a new usage of the typedef keyword may be syntax sugar for something else defined in Phobos. This new syntax of typedef may require a () after the keyword, to give space to specify the alternative kinds of typedef:typedef(subtype) ... ... The syntax typedef(...) is (I think) not syntactically compatiblewith C, so there is no problem with introducing a similar syntax with different semantics (this is even an improvement over D1, where typedef acts unlike C language).Bye, bearophile
Oct 21 2010
I recently had a good use for a typedef. I was interfacing with some C
code (explicitly loaded DLL), and I've made a function which allows me
to create wrapper functions for C automatically and add error checking
code which throws an exception, but only if the return value of a C
function is supossed to return an error code. The function would
return a list of these wrapped functions as a string, and then I would
mixin the string in a class.
For example, I could have thse C functions:
// C code
LIBError SomeFunction(void) { }
int anotherFunction(void) { }
and my function would create a dynamic loading mechanism for both
functions and add error checking for SomeFunction, the result would be
mixed in and a possible output would be:
// D pseudocode, loading mechanism and function pointer not shown here
void someFunction()
{
auto result = CSomeFunction();
if (result != LIBErrors.NoError)
{
throw new LIBException("SomeFunction returned failure code.", result);
}
return result;
}
int anotherFunction(void)
{
return CAnotherFunction();
}
The function would only generate the exception code if the return
value of the C function is "LIBError". The problem with this is that
LIBError was defined as an alias for a uint (this was autogenerated by
htod from a C header file). So my function couldn't differentiate
between a C function returning an int vs returning a LIBError, because
an alias doesn't introduce a new type and I don't know of any
introspection mechanism for detecting types that are aliased or not.
So using the "typedef int LIBError" trick I was able to differentiate
between C functions that return an int vs a LIBError, and put my mixin
generator function to good use.
On 10/21/10, F.Almeida <francisco.m.almeida gmail.com> wrote:
Extensions to turn typedef into a more useful construct have already
been proposed, but discussion on this has not evolved much since.
My first, naive, idea was shown here:
http://www.digitalmars.com/webnews/newsgroups.php?
art_group=digitalmars.D&article_id=114489
Both the syntax and the rules to enforce casting would need some
work, but the basic idea is give the programmer control over which
types such a variable can cast to and from.
== Quote from bearophile (bearophileHUGS lycos.com)'s article
In D.learn I have just given an answer about alias/typedef, in it
I have said that the decision to deprecate typedef was in the end
the right one:
http://www.digitalmars.com/webnews/newsgroups.php?
art_group=digitalmars.D.learn&article_id=22387
But once some time is passed, what do you want to do with the
typedef keyword? Just remove it and turn its usage in a syntax
error? Keep in mind that the original purpose of typedefs in D was
not imaginary, it was present to help a real need. If you program a
little in Pascal/ObjectPascal/Ada you quickly learn that a typedef
is useful.
So in my opinion a better solution is to design a better typedef,
that uses the "typedef" keyword, and supports a more flexible
semantics, as Andrei has suggested. This new usage of the "typedef"
keyword may even be introduced in D3, there's no need to rush. The
usage of "alias this" in structs will help, but a new usage of the
typedef keyword may be syntax sugar for something else defined in
Phobos. This new syntax of typedef may require a () after the
keyword, to give space to specify the alternative kinds of typedef:
typedef(subtype) ... ...
The syntax typedef(...) is (I think) not syntactically compatible
with C, so there is no problem with introducing a similar syntax
with different semantics (this is even an improvement over D1, where
typedef acts unlike C language).
Bye,
bearophile
Oct 21 2010









Antony <antonynoha yahoo.com> 