www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Polymorphic recursive class

reply "Jack Applegame" <japplegame gmail.com> writes:
This code doesn't compile, because recursive template expansion.

class Nested(A) {
   A left;
   Nested!(A[]) right;
   this(A l, Nested!(A[]) r) {
     left = l;
     right = r;
   }
}

void main() {
	Nested!int nested = new Nested(1, null);
}




But is there any reason why D can't follow MLton way - 
instantiate a class type template ONLY when a constructor of 
given class is used?
Jul 12 2015
next sibling parent reply "thedeemon" <dlang thedeemon.com> writes:
On Monday, 13 July 2015 at 06:31:33 UTC, Jack Applegame wrote:

 But is there any reason why D can't follow MLton way - 
 instantiate a class type template ONLY when a constructor of 
 given class is used?
Because if constructor isn't used doesn't mean the class isn't used: there can be some static methods or other stuff.
Jul 13 2015
parent reply "Jack Applegame" <japplegame gmail.com> writes:
On Monday, 13 July 2015 at 08:05:05 UTC, thedeemon wrote:
 On Monday, 13 July 2015 at 06:31:33 UTC, Jack Applegame wrote:

 But is there any reason why D can't follow MLton way - 
 instantiate a class type template ONLY when a constructor of 
 given class is used?
Because if constructor isn't used doesn't mean the class isn't used: there can be some static methods or other stuff.
Ok, lets instantiate it only when we use some stuff.
Jul 13 2015
parent reply "deadalnix" <deadalnix gmail.com> writes:
On Monday, 13 July 2015 at 08:12:28 UTC, Jack Applegame wrote:
 On Monday, 13 July 2015 at 08:05:05 UTC, thedeemon wrote:
 On Monday, 13 July 2015 at 06:31:33 UTC, Jack Applegame wrote:

 But is there any reason why D can't follow MLton way - 
 instantiate a class type template ONLY when a constructor of 
 given class is used?
Because if constructor isn't used doesn't mean the class isn't used: there can be some static methods or other stuff.
Ok, lets instantiate it only when we use some stuff.
Why does the spec needs to be made more complex for some code that you wouldn't be able to use anyway ? Just use static if and be done with it.
Jul 13 2015
parent "Jack Applegame" <japplegame gmail.com> writes:
On Monday, 13 July 2015 at 09:03:20 UTC, deadalnix wrote:
 Just use static if and be done with it.
How?
Jul 13 2015
prev sibling parent reply Dmitry Olshansky <dmitry.olsh gmail.com> writes:
On 13-Jul-2015 09:31, Jack Applegame wrote:
 This code doesn't compile, because recursive template expansion.

 class Nested(A) {
    A left;
    Nested!(A[]) right;
You might mean Nested!A[] ? Else it looks like making a construct that is: left - an element, right - { left - an array, right - { left - an array of arrays, right - { left- an array of array of arrays right - an so on ... WTF? } } } Or is that what you intended? -- Dmitry Olshansky
Jul 13 2015
parent reply "Jack Applegame" <japplegame gmail.com> writes:
On Monday, 13 July 2015 at 10:33:17 UTC, Dmitry Olshansky wrote:
 You might mean Nested!A[] ?
No.
 Else it looks like making a construct that is:

 left - an element,
 right - {
     left - an array,
     right - {
           left - an array of arrays,
           right - {
              left- an array of array of arrays
              right - an so on ... WTF?
           }
     }
 }
Yes, that is I intended. It is a pretty useless example, just for demonstrating the lack of support polymorphic recursive data types.
Jul 13 2015
parent reply "deadalnix" <deadalnix gmail.com> writes:
On Monday, 13 July 2015 at 11:36:48 UTC, Jack Applegame wrote:
 Yes, that is I intended.
 It is a pretty useless example, just for demonstrating the lack 
 of support polymorphic recursive data types.
So the point is that we should add feature to the language to support useless use cases ?
Jul 13 2015
next sibling parent reply "Jack Applegame" <japplegame gmail.com> writes:
On Monday, 13 July 2015 at 12:53:12 UTC, deadalnix wrote:
 On Monday, 13 July 2015 at 11:36:48 UTC, Jack Applegame wrote:
 Yes, that is I intended.
 It is a pretty useless example, just for demonstrating the 
 lack of support polymorphic recursive data types.
So the point is that we should add feature to the language to support useless use cases ?
Not all cases are useless. For example, typical functional programming patterns like recursive compile-time trees and lists.
Jul 13 2015
next sibling parent "deadalnix" <deadalnix gmail.com> writes:
On Monday, 13 July 2015 at 13:15:46 UTC, Jack Applegame wrote:
 Not all cases are useless. For example, typical functional 
 programming patterns like recursive compile-time trees and 
 lists.
Such a construct in pseudo-D would be useful for all to understand.
Jul 13 2015
prev sibling parent reply Dmitry Olshansky <dmitry.olsh gmail.com> writes:
On 13-Jul-2015 16:15, Jack Applegame wrote:
 On Monday, 13 July 2015 at 12:53:12 UTC, deadalnix wrote:
 On Monday, 13 July 2015 at 11:36:48 UTC, Jack Applegame wrote:
 Yes, that is I intended.
 It is a pretty useless example, just for demonstrating the lack of
 support polymorphic recursive data types.
So the point is that we should add feature to the language to support useless use cases ?
Not all cases are useless. For example, typical functional programming patterns like recursive compile-time trees and lists.
You can do it no problem, it just requires to manually implement boxing and make `right` a template that casts to the right type. The reason is that D doesn't provide an extra abstraction layer that is "auto-magically" there in typical FP language. Not tested but this should work: class Nested(T){ T left; void* right_; // or use opaque type if allergic to void* property auto right()(){ // empty template to prevent recursion return cast(Nested!(T[])right_; } property auto right(U)(Nested!U type){ // empty template to prevent recursion right_ = cast(void*)right_; } // and lastly the constructor should be templated this(U)(T l, Nested!(U) r) { left = l; right = r; } } -- Dmitry Olshansky
Jul 13 2015
next sibling parent "Jack Applegame" <japplegame gmail.com> writes:
On Monday, 13 July 2015 at 13:51:51 UTC, Dmitry Olshansky wrote:
 You can do it no problem, it just requires to manually 
 implement boxing and make `right` a template that casts to the 
 right type. The reason is that D doesn't provide an extra 
 abstraction layer that is "auto-magically" there in typical FP 
 language.

 Not tested but this should work:

 class Nested(T){
 	T left;
 	void* right_; // or use opaque type if allergic to void*
 	 property auto right()(){ // empty template to prevent 
 recursion
 		return cast(Nested!(T[])right_;
 	}
 	 property auto right(U)(Nested!U type){ // empty template to 
 prevent recursion
 		right_ =  cast(void*)right_;
 	}
 	
 	// and lastly the constructor should be templated
 	this(U)(T l, Nested!(U) r) {
    	 left = l;
    	 right = r;
   	}
 }
Wow! Template properties is nice idea. Thanks.
Jul 13 2015
prev sibling parent reply "Jack Applegame" <japplegame gmail.com> writes:
Yes! It works: http://dpaste.dzfl.pl/b9c6a2a958e5
Jul 13 2015
parent Dmitry Olshansky <dmitry.olsh gmail.com> writes:
On 13-Jul-2015 19:44, Jack Applegame wrote:
 Yes! It works: http://dpaste.dzfl.pl/b9c6a2a958e5
Good to know ;) -- Dmitry Olshansky
Jul 13 2015
prev sibling parent reply "Morbid.Obesity" <Morbid.Obesity mail.com> writes:
On Monday, 13 July 2015 at 12:53:12 UTC, deadalnix wrote:
 On Monday, 13 July 2015 at 11:36:48 UTC, Jack Applegame wrote:
 Yes, that is I intended.
 It is a pretty useless example, just for demonstrating the 
 lack of support polymorphic recursive data types.
So the point is that we should add feature to the language to support useless use cases ?
Stop being an asshole! You don't know everything. It's only useless cause your tiny brain doesn't know how to use it properly. Instead, wake the fuck up and realize there are other people in the world that think/desire things you don't. Fucking arrogant prick!
Jul 14 2015
parent ketmar <ketmar ketmar.no-ip.org> writes:
On Wed, 15 Jul 2015 01:32:22 +0000, Morbid.Obesity wrote:

love you, dear.=
Jul 15 2015