delegate object instead of a literal

Joel Christensen joelcnz at gmail.com
Sun Aug 14 23:11:02 PDT 2011


On 15-Aug-11 5:21 PM, Joel Christensen wrote:
> On 15-Aug-11 2:55 PM, Jonathan M Davis wrote:
>> On Sunday, August 14, 2011 20:50:03 Joel Christensen wrote:
>>> Hi,
>>>
>>> This program loops through a string until it finds a number and gives
>>> the position of it.
>>>
>>> The first assert works, but not the second one.
>>>
>>> import std.algorithm;
>>>
>>> void main() {
>>> static bool isNumber( char input, char dummy ) {
>>> if ( ( input>= '0'&& input<= '9' ) || input == '.' )
>>> return true;
>>> else
>>> return false;
>>> }
>>>
>>> string str = "abc123";
>>> assert( countUntil!( ( input, b ) {
>>> if ( ( input>= '0'&& input<= '9' ) || input == '.' ) return true;
>>> else return false;
>>> } )(str, 0) == 3 ); // works
>>> assert( countUntil!( isNumber, string, string )( str, 0 ) == 3 );
>>> }
>>>
>>> This is the error:
>>> parse.d(15): Error: template instance
>>> countUntil!(isNumber,string,string) does not match template declaration
>>> countUntil(alias pred = "a == b",R1,R2) if
>>> (is(typeof(startsWith!(pred)(haystack,needle))))
>>
>> By the way, it looks like std.algorithm.count will do what you want to do
>> (though you'll have to negate the predicate for it to work - either with
>> std.functional.not or by changing it appropriately).
>>
>> - Jonathan M Davis
>
> Ok, cool.
>
> I think this is nice:
>
> immutable isNum = `a >= '0' && a <= '9' && a != '"'`;
> auto input = "abc123";
> auto indexEnd = count!( not!isNum )( input );
> assert( indexEnd == 3 );
>
> - Joel

Oops, should be. -- immutable isNum = `( a >= '0' && a <= '9' ) || a == 
'.'`;
But that's the idea any way. Also forgot to have the variable 'input' 
declared in a post.

- Joel


More information about the Digitalmars-d-learn mailing list