Firstly, let me preface this... if you use templates to get around the const system's imperfections, you are admitting that the const system is broken. Now, on with the program.

My unique experience in using D2 without Phobos lead me to encounter two cases that show how the D2 const system is just a pain in the behind for some really reasonable tasks.

First case:

You want to sort an array of strings using a function. Strings can be all of these types: char[], const(char)[] and immutable(char)[]. What would be the signature of such a function?

It can't be sort(const(char)[][]) because it's unsafe to case char[][] and immutable(char)[][] to that argument type (see http://d.puremagic.com/issues/show_bug.cgi?id=4251 ). It can't be sort(const(char[])[]) because you can't actually sort that!

The only good way I found is to use a cast inside the function with the second signature. Obviously I'm glad there's a workabout, but surely a cast isn't a good thing.

Second case:

inout was meant to solve issues with functions that return slices of inputs. What about a class that is dedicated to the same functionality?

E.g. this works fine:

inout(char)[] half(inout(char)[]);

But what about this:

struct Slicer
{
  char[] a;
  char[] half();
}

Note that the type of the input (the member 'a') must be the same as the output of the half method. I don't know how to accomplish this without templates. But as I said in the preface, you shouldn't need templates for such a simple task. Note that doing this isn't satisfactory:

struct Slicer
{
  char[] a;
  inout(char)[] half() inout;
}

because there may be other members inside that struct that may need to remain mutable.

This is very relevant, incidentally, for the planned library implementation of associative arrays. How would this be implemented when an associative array is a struct?

inout(char)[] test(inout(char)[])
{
  inout(char)[][int] a;
}

It doesn't even compile now (in dmd 2.058).

I don't have any solutions to these problems, incidentally... I think they are complex, but definitely worthy of having a reasonable solution that doesn't involve needless (in this case) templates.

-SiegeLord

Reply via email to