On 04/10/2012 03:24 AM, Cristi Cobzarenco wrote:
Thanks for the suggestions!

I don't think UFCS would help us. Our problem is that we can't do this:
triangular.d:
   struct TriangularMatrix {

   }

   void sum( T )( T x ) if( is( T : TriangularMatrix ) ) {

   }

diagonal.d:
   struct DiagonalMatrix {

   }

   void sum( T )( T x ) if( is( T : DiagonalMatrix ) ) {
   }

main.d:
import diagonal;
import triangular;

void bar() {
    TriangularMatrix a;
    Diagonal b;
    sum( a );  // this does not compile because sum() is ambiguous
    sum( b );  // nor does this
}

There are no ambiguities in that example, and if ambiguities occur, they can always be fixed manually.


This, AFAIK, is deliberate to avoid name hijacking - ADL in C++ had its
share of criticism. I doubt we will ever get this behaviour in D and
that is perhaps a good thing. I may have misunderstood UFCS though - or
what you meant by making non-member function calls look nicer - please
correct me if that's the case.

Don't worry about long names, t() is already the way transposition is
defined SciD. Moreover, it's a property so you can actually do "a.t * a"
- convenience galore. I'm also considering of creating a submodule like
std.linalg.short which defines aliases with short names for types and
free functions - this will allow particularly numerics-heavy functions
to be written more compactly. I'm not entirely sure it would be a good
idea though as it may sacrifice readability where it's most needed.

---
Cristi Cobzarenco
BSc in Artificial Intelligence and Computer Science
University of Edinburgh
Profile: http://www.google.com/profiles/cristi.cobzarenco


If you change 'Diagonal' to 'DiagonalMatrix', this compiles fine.

Reply via email to