digitalmars.D - Suggestions
- vincent catrino (45/45) Dec 04 2006 Hi there,
- Oskar Linde (23/54) Dec 04 2006 D doesn't have dynamic multidimensional arrays built in (it may be on a
- Daniel Keep (13/30) Dec 04 2006 Howdy, and welcome to the NG. Please keep your arms and legs inside the...
Hi there, I have been following D for about 1.5 year and I really like this language. I use it for casual programming and for fun. I'm a software engineer using mainly C, JAVA and FORTRAN 77. There are a few things that I use all the time in C and JAVA and that I really would appreciate to find in the D language. * C99 allows the following : int func( int n, int a[n][n] ) { ... do something ... } D forbids this. It is possible to have this in D for example by creating a structure like this. struct Mati { int *ptr; int dim; int *opIndex(int i) { return ptr + i*dim; } }; and rewriting func like this int func( int n, int *ptr ) { Mati m = new Mati(); m.ptr = ptr; m.dim = n; m[1][5] = 3; } Would it be possible to have this in D directly ? Or maybe there is a cute D way to have this already and I woould be glad to learn it. * Indirection. in C when you get a structure pointer you use the '->' operator instead of '.' to access members. In D only '.' is allowed. Would it be possible to have '->' too as a synomym for '.' ? This is just syntaxic sugar and D works well without this but when working in D I switch back to my C habits and naturally use '->'. * JAVA has a base object type too which is used as the base class for all other classes. In JAVA the basic object type provides synchronization primitives which are quite useful : void wait() void wait( long timeout ) void notify() void notifyAll() Maybe it is already possible to do this in D and I haven't understood how. If yes I would be glad to learn how to do so, if not maybe these facilities might be added to the D object type ? Best regards Vincent
Dec 04 2006
vincent catrino wrote:Hi there, I have been following D for about 1.5 year and I really like this language. I use it for casual programming and for fun. I'm a software engineer using mainly C, JAVA and FORTRAN 77. There are a few things that I use all the time in C and JAVA and that I really would appreciate to find in the D language. * C99 allows the following : int func( int n, int a[n][n] ) { ... do something ... } D forbids this. It is possible to have this in D for example by creating a structure like this. struct Mati { int *ptr; int dim; int *opIndex(int i) { return ptr + i*dim; } }; and rewriting func like this int func( int n, int *ptr ) { Mati m = new Mati(); m.ptr = ptr; m.dim = n; m[1][5] = 3; } Would it be possible to have this in D directly ? Or maybe there is a cute D way to have this already and I woould be glad to learn it.D doesn't have dynamic multidimensional arrays built in (it may be on a TODO for >= 2.0). A better way is to consistently use a custom array type (just like you do). I.e. something like: struct SquareMatrix { int *ptr; int dim; int opIndex(int i, int j) { return ptr[j+i*dim]; } int opIndexAssign(int v, int i, int j) { return ptr[j+i*dim] = v;} } (Or the Mati one above) And pass that directly to the functions: int func(SquareMatrix m) { m[1,5] = 3; ... } I have written several such array and matrix types and they work well in practice. The downsides are: - No reference return type from opIndex, meaning e.g, m[1,5]++; is impossible. (You solve that quite neatly) - Not standardized - Mixing slicing and indexing not possible with the .. syntax Regards, Oskar
Dec 04 2006
vincent catrino wrote:Hi there,Howdy, and welcome to the NG. Please keep your arms and legs inside the NG at all times, lest you lose them. :P* Indirection. in C when you get a structure pointer you use the '->' operator instead of '.' to access members. In D only '.' is allowed. Would it be possible to have '->' too as a synomym for '.' ? This is just syntaxic sugar and D works well without this but when working in D I switch back to my C habits and naturally use '->'.Don't hold your breath. It's a conscious design decision for D to avoid having many ways of saying the same thing. Afraid you'll just have to learn to not use '->' any more :3 Look on the bright side: now you only need to remember one member access operator!* JAVA has a base object type too which is used as the base class for all other classes. In JAVA the basic object type provides synchronization primitives which are quite useful : void wait() void wait( long timeout ) void notify() void notifyAll() Maybe it is already possible to do this in D and I haven't understood how. If yes I would be glad to learn how to do so, if not maybe these facilities might be added to the D object type ?I'm not familiar with what these do, but you might want to take a peek at the std.thread module. It's hard to say much else without knowing what those methods do (and I have no intention of learning any more Java than I already know.) -- Daniel
Dec 04 2006