On Fri, Jul 24, 2009 at 8:27 PM, asd<[email protected]> wrote:
> I've got D2 code:
>
>> template ObjcMethodSelectorCheck(string sel, A...) {
>>       const n = countMethodArguments(sel);
>
> and:
>
> pure static uint countMethodArguments(string name) {
>                if (name.length == 0) return 0;
>                if (name[0] == ':') return 1+countMethodArguments(name[1..$]);
>                return countMethodArguments(name[1..$]);
>        }
>
> Original version of this method was pure too, but used count++. Fine, maybe 
> compiler wasn't smart enough to understand that, but now I've rewritten it in 
> purely functional style, and it's still not "constant" enough!
>
> objc/method.d(54): Error: cannot evaluate 
> countMethodArguments(ToSetterSelector) at compile time
> objc/method.d(57): Error: expression 1u != 
> countMethodArguments(ToSetterSelector) is not constant or does not evaluate 
> to a bool

I think something else is going on.  I can't reproduce any problems:

pure static uint countMethodArguments(string name)
{
    if(name.length == 0)
        return 0;

    if(name[0] == ':')
        return 1 + countMethodArguments(name[1 .. $]);

    return countMethodArguments(name[1 .. $]);
}

template Temp(string sel)
{
    const Temp = countMethodArguments(sel);
}

void main()
{
    writeln(Temp!("foo:bar:")); // prints 2
}

Can you post more of your code?

Reply via email to