On Thu, 06 Oct 2011 10:56:43 -0400, Gor Gyolchanyan
<gor.f.gyolchan...@gmail.com> wrote:
Hi, guys.
I just made my handy parsing struct take an arbitrary range, instead
of a dstring and immediately rain head-first into a brick wall of
errors.
There's this function:
bool next(bool function(ElementType!InputType) pred)
, where InputType is bound to be dstring and which gets called like this:
parser.next(&isAlpha)
, where isAlpha is from std.uni.
When i do that, i get this error:
Error: cannot implicitly convert expression (& isAlpha) of type
bool function(dchar c) pure nothrow @safe to bool
function(immutable(dchar))
Yes, I understand why do i get this error.
What i don't understand is: does the dchar being immutable really
change anything?
What it does is make it so during the function, the parameter cannot be
changed. It technically has no effect on what you can pass to the
function, since as you rightly point out, ints implicitly cast between
const, immutable, and mutable.
Why did someone do it? To ensure they didn't accidentally write code that
changed the value inside the function. The compiler might also use that
information to do some optimization (i.e. avoid reloading into a
register), but I doubt it's necessary for that.
To answer your underlying question, why doesn't the delegate "just work"?
It's because D does not allow implicit casting of delegates or functions
at all. I assume this will get better at some point, because implicit
casting of delegates would make things just so much smoother in generic
programming.
-Steve