Two cases showing imperfection of the const system

SiegeLord none at none.com
Thu Feb 16 13:48:27 PST 2012


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


More information about the Digitalmars-d mailing list