Re: `this` and nested structs
On Thursday, May 10, 2018 06:31:09 Mike Franklin via Digitalmars-d-learn wrote: > On Thursday, 10 May 2018 at 06:22:37 UTC, Jonathan M Davis wrote: > > Structs don't have that. > > Should they? Honestly, I don't think that classes should have it, but changing it now would break code (most notably, DWT). IMHO, it would have been far better to make it explicit like it is in C++, especially since there's no technical reason why it needs to be built in. But regardless, when you consider how structs work, having a nested struct inside a struct have a pointer to its outer struct would be a serious problem, because the pointer would become invalid as soon as the struct was moved, which happens quite frequently with structs in D when they're passed around. Having a nested struct within a class have a reference to its parent would be more debatable, but it would probably run afoul of how init works, since the init value for the struct would have to be known at compile-time, whereas the reference for the class couldn't be. And anyone who wants any kind of reference to the outer class to be in the struct can just pass it to the struct's constructor. Adding such a feature to structs would just be unnecessary magic. - Jonathan M Davis
Re: `this` and nested structs
On Thursday, 10 May 2018 at 06:22:37 UTC, Jonathan M Davis wrote: Structs don't have that. Should they?
Re: `this` and nested structs
On Thursday, May 10, 2018 03:23:50 Mike Franklin via Digitalmars-d-learn wrote: > My understanding is that nested structs have an implicit context > pointer to their containing scope. A non-static struct inside a function does, but I suspect that you're thinking about non-static nested classes (within classes), which I believe was done to be compatible with Java (in order to make porting code easier). Structs don't have that. - Jonathan M Davis
Re: `this` and nested structs
On Thursday, 10 May 2018 at 03:23:50 UTC, Mike Franklin wrote: Consider the following code: --- struct S { // intentionally not `static` struct SS { int y() { return x; } // Error: need `this` for `x` of type `int` } int x; SS ss; } void main() { S s; s.ss.y(); } --- If I change `return x;` to `return this.x;` then of course it emits the following error: Error: no property `x` for type `SS` My understanding is that `SS` should have a context pointer to an instance of `S`, but how do I navigate the members of `S` and `SS`. Is this a bug? Thanks, Mike My understanding is that nested structs have an implicit context pointer to their containing scope. Nesting with hidden context pointer is only for nested structs inside functions. https://dlang.org/spec/struct.html#nested This is a source a confusion unfortunately.
`this` and nested structs
Consider the following code: --- struct S { // intentionally not `static` struct SS { int y() { return x; } // Error: need `this` for `x` of type `int` } int x; SS ss; } void main() { S s; s.ss.y(); } --- If I change `return x;` to `return this.x;` then of course it emits the following error: Error: no property `x` for type `SS` My understanding is that `SS` should have a context pointer to an instance of `S`, but how do I navigate the members of `S` and `SS`. Is this a bug? Thanks, Mike My understanding is that nested structs have an implicit context pointer to their containing scope.
Re: How to handle nested structs when converting C headers?
On Thu, 12 Dec 2013 00:04:07 -, H. S. Teoh hst...@quickfur.ath.cx wrote: On Thu, Dec 12, 2013 at 12:54:58AM +0100, Gary Willoughby wrote: On Wednesday, 11 December 2013 at 23:38:13 UTC, Adam D. Ruppe wrote: On Wednesday, 11 December 2013 at 23:35:04 UTC, Gary Willoughby wrote: static union internalRep try static union InternalRep { /* note the capital letter */ /* snip */ } InternalRep internalRep;; // still need a decl Right. But why use the static keyword here? Because nested structs by default carry a pointer to the containing struct (or scope), which means it adds extra baggage and you can't create the nested without also having an instance of the containing struct. I would stop nesting the struct definition. I think that is both cleaner and closer to the original intent - the only reason it is nested in C is because C allows definition and declaration that way, and D does not. Then you don't need static at all. R -- Using Opera's revolutionary email client: http://www.opera.com/mail/
Re: How to handle nested structs when converting C headers?
Regan Heath: I would stop nesting the struct definition. I think that is both cleaner and closer to the original intent - the only reason it is nested in C is because C allows definition and declaration that way, and D does not. Then you don't need static at all. It's mostly a matter of style, but here I prefer a little more the nested form. It's syntactically closer to the original C file, for a D programmer static struct has a known and clear meaning, and putting the structs inside the other keeps the global namespace clean of those inner names. Like with nested functions putting names inside other scoped helps the programmer see they are just needed there. Bye, bearophile
Re: How to handle nested structs when converting C headers?
On 2013-12-11 23:45, Gary Willoughby wrote: How to handle nested structs when converting C headers? In the following snippet i'm currently converting, how would you convert the nested typed union and structures? Would you declare them separately then use their types in the Tcl_Obj struct? or is there a nice way in D to nest them like C? Convert using DStep[1] and see what happens :) [1] https://github.com/jacob-carlborg/dstep -- /Jacob Carlborg
How to handle nested structs when converting C headers?
How to handle nested structs when converting C headers? In the following snippet i'm currently converting, how would you convert the nested typed union and structures? Would you declare them separately then use their types in the Tcl_Obj struct? or is there a nice way in D to nest them like C? typedef struct Tcl_Obj { int refCount; /* When 0 the object will be freed. */ char *bytes;/* This points to the first byte of the * object's string representation. The array * must be followed by a null byte (i.e., at * offset length) but may also contain * embedded null characters. The array's * storage is allocated by ckalloc. NULL means * the string rep is invalid and must be * regenerated from the internal rep. Clients * should use Tcl_GetStringFromObj or * Tcl_GetString to get a pointer to the byte * array as a readonly value. */ int length; /* The number of bytes at *bytes, not * including the terminating null. */ Tcl_ObjType *typePtr; /* Denotes the object's type. Always * corresponds to the type of the object's * internal rep. NULL indicates the object has * no internal rep (has no type). */ union { /* The internal representation: */ long longValue; /* - an long integer value. */ double doubleValue; /* - a double-precision floating value. */ VOID *otherValuePtr;/* - another, type-specific value. */ Tcl_WideInt wideValue; /* - a long long value. */ struct {/* - internal rep as two pointers. */ VOID *ptr1; VOID *ptr2; } twoPtrValue; struct {/* - internal rep as a wide int, tightly * packed fields. */ VOID *ptr; /* Pointer to digits. */ unsigned long value;/* Alloc, used, and signum packed into a * single word. */ } ptrAndLongRep; } internalRep; } Tcl_Obj;
Re: How to handle nested structs when converting C headers?
On Wednesday, 11 December 2013 at 22:45:35 UTC, Gary Willoughby wrote: How to handle nested structs when converting C headers? Nested structs and unions like in your example are supported in D too, same syntax, same effect.
Re: How to handle nested structs when converting C headers?
On Wednesday, 11 December 2013 at 22:54:04 UTC, Adam D. Ruppe wrote: Nested structs and unions like in your example are supported in D too, same syntax, same effect. Actually, no, not quite the same syntax, I didn't notice the name at the end of the C one (in D, the anonymous nested structs and unions are supported). But almost the same then: make them a nested type with a name after the struct or union keyword then the member. So struct TwoPtrValue {/* - internal rep as two pointers. */ VOID *ptr1; VOID *ptr2; } TwoPtrValue twoPtrValue; that's how I'd do it
Re: How to handle nested structs when converting C headers?
Adam D. Ruppe: Nested structs and unions like in your example are supported in D too, same syntax, same effect. But don't forget to add to use static struct instad of struct. Bye, bearophile
Re: How to handle nested structs when converting C headers?
On Wednesday, 11 December 2013 at 23:12:39 UTC, bearophile wrote: Adam D. Ruppe: Nested structs and unions like in your example are supported in D too, same syntax, same effect. But don't forget to add to use static struct instad of struct. Bye, bearophile Have you got an example because i always get: tcl.d(713): Error: no identifier for declarator twoPtrValue tcl.d(718): Error: no identifier for declarator ptrAndLongRep tcl.d(719): Error: no identifier for declarator internalRep
Re: How to handle nested structs when converting C headers?
On Wednesday, 11 December 2013 at 23:27:57 UTC, Gary Willoughby wrote: On Wednesday, 11 December 2013 at 23:12:39 UTC, bearophile wrote: Adam D. Ruppe: Nested structs and unions like in your example are supported in D too, same syntax, same effect. But don't forget to add to use static struct instad of struct. Bye, bearophile Have you got an example because i always get: tcl.d(713): Error: no identifier for declarator twoPtrValue tcl.d(718): Error: no identifier for declarator ptrAndLongRep tcl.d(719): Error: no identifier for declarator internalRep Like this perhaps: struct Tcl_Obj { int refCount; char* bytes; int length; Tcl_ObjType* typePtr; static union internalRep { c_long longValue; double doubleValue; void* otherValuePtr; Tcl_WideInt wideValue; static struct twoPtrValue { void* ptr1; void* ptr2; } static struct ptrAndLongRep { void* ptr; c_ulong value; } } }
Re: How to handle nested structs when converting C headers?
On Wednesday, 11 December 2013 at 23:35:04 UTC, Gary Willoughby wrote: static union internalRep try static union InternalRep { /* note the capital letter */ /* snip */ } InternalRep internalRep;; // still need a decl
Re: How to handle nested structs when converting C headers?
Gary Willoughby: Have you got an example because i always get: tcl.d(713): Error: no identifier for declarator twoPtrValue tcl.d(718): Error: no identifier for declarator ptrAndLongRep tcl.d(719): Error: no identifier for declarator internalRep In D you can't define a struct/union and use it to define an instance on the fly. You have to split definition and use in two parts. Bye, bearophile
Re: How to handle nested structs when converting C headers?
On Wednesday, 11 December 2013 at 23:36:11 UTC, bearophile wrote: In D you can't define a struct/union and use it to define an instance on the fly. Well, you can if it is anonymous. struct Foo { union { struct { ubyte a; ubyte b; } ubyte[2] arr; } } That works in D, and it makes foo.a == arr[0] and foo.b == arr[1];
Re: How to handle nested structs when converting C headers?
Adam D. Ruppe: Well, you can if it is anonymous. struct Foo { union { struct { ubyte a; ubyte b; } ubyte[2] arr; } } That works in D, and it makes foo.a == arr[0] and foo.b == arr[1]; Right :-) I like D structs. Bye, bearophile
Re: How to handle nested structs when converting C headers?
On Wednesday, 11 December 2013 at 23:38:13 UTC, Adam D. Ruppe wrote: On Wednesday, 11 December 2013 at 23:35:04 UTC, Gary Willoughby wrote: static union internalRep try static union InternalRep { /* note the capital letter */ /* snip */ } InternalRep internalRep;; // still need a decl Right. But why use the static keyword here?
Re: How to handle nested structs when converting C headers?
On Thu, Dec 12, 2013 at 12:54:58AM +0100, Gary Willoughby wrote: On Wednesday, 11 December 2013 at 23:38:13 UTC, Adam D. Ruppe wrote: On Wednesday, 11 December 2013 at 23:35:04 UTC, Gary Willoughby wrote: static union internalRep try static union InternalRep { /* note the capital letter */ /* snip */ } InternalRep internalRep;; // still need a decl Right. But why use the static keyword here? Because nested structs by default carry a pointer to the containing struct (or scope), which means it adds extra baggage and you can't create the nested without also having an instance of the containing struct. T -- It is of the new things that men tire --- of fashions and proposals and improvements and change. It is the old things that startle and intoxicate. It is the old things that are young. -- G.K. Chesterton
Ddoc: no docs generated for nested structs?
I wrote a whole bunch of documentation for a struct that I later decided to transplant inside another struct (because the two are closely linked), and now the former struct's docs have vanished. Is this expected behaviour? T -- I am a consultant. My job is to make your job redundant. -- Mr Tom
Re: Ddoc: no docs generated for nested structs?
On Wed, Mar 07, 2012 at 03:49:26PM -0800, H. S. Teoh wrote: I wrote a whole bunch of documentation for a struct that I later decided to transplant inside another struct (because the two are closely linked), and now the former struct's docs have vanished. Is this expected behaviour? [...] Argh, nevermind what I wrote. In the course of moving the code I accidentally inserted another declaration between the struct and the ddoc comment. T -- Nearly all men can stand adversity, but if you want to test a man's character, give him power. -- Abraham Lincoln
Re: Ddoc: no docs generated for nested structs?
On Wednesday, March 07, 2012 16:37:44 H. S. Teoh wrote: On Wed, Mar 07, 2012 at 03:49:26PM -0800, H. S. Teoh wrote: I wrote a whole bunch of documentation for a struct that I later decided to transplant inside another struct (because the two are closely linked), and now the former struct's docs have vanished. Is this expected behaviour? [...] Argh, nevermind what I wrote. In the course of moving the code I accidentally inserted another declaration between the struct and the ddoc comment. If it's nested inside of a function, then any docs on the struct shouldn't end up in the documentation. But documentation on structs or classes nested inside of other structs or classes should definitely show up. - Jonathan M Davis
C-style nested structs convert to D
Hey all, I'm trying to rewrite a few .h files into D so I can call a C library. One snag I've hit is this guy: struct _tree_t { _tree_t* next; _tree_t* father; _tree_t* sons; } D won't do the nested struct thing, so I need to convert this into something D will like, but which the library will still take in. What should I do?