www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Re: Interfaces and Template Specializations

reply =?ISO-8859-1?Q?Bj=f6rn_T._Herzig?= <raichoo googlemail.com> writes:
dsimcha Wrote:

 == Quote from Björn_T._Herzig (raichoo googlemail.com)'s article
 Hi,
 I've been trying out D lately and stumbled upon the following problem.
 I have 2 interfaces:
 interface Plugable
 {
 	public void plug();
 }
 interface Printable
 {
 	public void print();
 }
 and two classes that implement those named Test which implements Plugable and

 I now want to create a generic function with two specializations.
 void tester(U)(U u) if (is(U : Plugable) && is(U : Printable))
 {
 	writefln("U : Printable, Plugable");
 	u.plug();
 	u.print();
 }
 void tester(U : Printable)(U u)
 {
 	writefln("U : printable");
 	u.print();
 }
 First of all this doesn't compile with the dmd 2.014 compiler since it doesn't

wrong?). http://digitalmars.com/d/2.0/changelog.html#new2_015 This syntax is called constraints. It didn't exist before 2.015. The info on some pages is outdated. The latest DMD version is 2.023.
 Another thing is that it's really weird syntax. In the second
 specialization it's enough to write U : Plugable but it's not
 possible to write something like void tester(U : Printable, Plugable)(U u)
since

Wouldn't it be much nicer if you could write something like this : void tester(U : (Plugable, Printable))(U u) and void tester(U : (Plugable))(U u)? This way it would be possible to use a unified syntax for both cases without the need for a special case with the if-statement. The weird syntax is because the first case is a constraint and the second is a template specialization. For consistency, it might be better to just use constraints for everything. Overall, though, D2's compile-time reflection system grew very organically and has a lot of duplicated features. There's been some discussion in the past about how to reduce this complexity by removing redundancy. You may have stumbled on one here: Constraints, as far as I can tell, are just a more general case of template specialization. Maybe we don't need template specialization anymore.

Thanks, where can I get that version? I'm currently using dmd_2.014-052208_i386.deb from the download page. never saw a newer version. Right now my only possibility to use D is inside of an ubuntu vm which is not really the greatest way... i'd really like to know if dmd will be ported to Solaris. Regards, Björn
Jan 10 2009
next sibling parent "Jarrett Billingsley" <jarrett.billingsley gmail.com> writes:
On Sat, Jan 10, 2009 at 8:10 PM, Bj=F6rn T. Herzig <raichoo googlemail.com>=
 wrote:
 dsimcha Wrote:

 =3D=3D Quote from Bj=F6rn_T._Herzig (raichoo googlemail.com)'s article
 Hi,
 I've been trying out D lately and stumbled upon the following problem.
 I have 2 interfaces:
 interface Plugable
 {
     public void plug();
 }
 interface Printable
 {
     public void print();
 }
 and two classes that implement those named Test which implements Pluga=



 Printable, and Test2 which only implements Plugable.
 I now want to create a generic function with two specializations.
 void tester(U)(U u) if (is(U : Plugable) && is(U : Printable))
 {
     writefln("U : Printable, Plugable");
     u.plug();
     u.print();
 }
 void tester(U : Printable)(U u)
 {
     writefln("U : printable");
     u.print();
 }
 First of all this doesn't compile with the dmd 2.014 compiler since it=



 accept the if statement after the template declaration (Or did I do some=


 wrong?).

 http://digitalmars.com/d/2.0/changelog.html#new2_015

 This syntax is called constraints.  It didn't exist before 2.015.  The i=


 some pages is outdated.  The latest DMD version is 2.023.

 Another thing is that it's really weird syntax. In the second
 specialization it's enough to write U : Plugable but it's not
 possible to write something like void tester(U : Printable, Plugable)(=



 Plugable would be handled as a second template parameter (or am I mistak=


 Wouldn't it be much nicer if you could write something like this : void =


 (Plugable, Printable))(U u) and void tester(U : (Plugable))(U u)? This w=


 would be possible to use a unified syntax for both cases without the nee=


 special case with the if-statement.

 The weird syntax is because the first case is a constraint and the secon=


 template specialization.  For consistency, it might be better to just us=


 constraints for everything.

 Overall, though, D2's compile-time reflection system grew very organical=


 a lot of duplicated features.  There's been some discussion in the past =


 to reduce this complexity by removing redundancy.  You may have stumbled=


 here:  Constraints, as far as I can tell, are just a more general case o=


 specialization.  Maybe we don't need template specialization anymore.

Thanks, where can I get that version? I'm currently using dmd_2.014-052208_i386.d=

sibility to use D is inside of an ubuntu vm which is not really the greates= t way... i'd really like to know if dmd will be ported to Solaris.
 Regards,
 Bj=F6rn

Go to the changelog. http://www.digitalmars.com/d/2.0/changelog.html
Jan 10 2009
prev sibling parent Christopher Wright <dhasenan gmail.com> writes:
Björn T. Herzig wrote:
 where can I get that version? I'm currently using dmd_2.014-052208_i386.deb
from the download page. never saw a newer version. Right now my only
possibility to use D is inside of an ubuntu vm which is not really the greatest
way... i'd really like to know if dmd will be ported to Solaris.

LDC is the place to look for a Solaris port. I think I recall someone working on an LDC Solaris port, but if that is the case, I think it has not gone very far yet.
Jan 11 2009