Pass range to a function

Meta via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Jul 28 17:12:11 PDT 2017


On Thursday, 27 July 2017 at 21:16:03 UTC, Chris wrote:
> I'm using regex `matchAll`, and mapping it to get a sequence of 
> strings. I then want to pass that sequence to a function. What 
> is the general "sequence of strings" type declaration I'd need 
> to use?
>
> In C#, it'd be `IEnumerable<string>`. I'd rather not do a 
> to-array on the sequence, if possible. (e.g. It'd be nice to 
> just pass the lazy sequence into my categorize function.)
>
> What is the value of `???` in the following program:
>
>
> ```
> import std.stdio, std.regex, std.string, 
> std.algorithm.iteration;
>
> auto regexToStrSeq(RegexMatch!string toks) {
>   return toks.map!(t => t[0].strip());
> }
>
> void categorize(??? toks) {
>   foreach (t; toks) {
>     writeln(t);
>   }
> }
>
> void main()
> {
>     auto reg = 
> regex("[\\s,]*(~@|[\\[\\]{\\}()'`~^@]|\"(?:\\\\.|[^\\\\\"])*\"|;.*|[^\\s\\[\\]{}('\"`,;)]*)");
>     auto line = "(+ 1 (* 2 32))";
>     auto baz = matchAll(line, reg);
>
>     categorize(regexToStrSeq(baz).array);
> }
> ```

If for some reason you can't make categorize a template like Ali 
suggested, or you need runtime polymorphism, you can use 
std.range.interfaces:

import std.range.interfaces;

void categorize(InputRange!string toks)
{
     foreach (t; toks) {
         writeln(t);
     }
}

void main()
{
     //etc.
     categorize(inputRangeObject(regexToStrSeq(baz)));
}


More information about the Digitalmars-d-learn mailing list