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

Reply via email to