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

Reply via email to