What does func!thing mean?

ProgrammingGhost dsioafiseghvfawklncfskzdcf at sdifjsdiovgfdisjcisj.com
Fri Nov 8 12:15:13 PST 2013


On Friday, 8 November 2013 at 06:25:15 UTC, qznc wrote:
> On Friday, 8 November 2013 at 05:46:29 UTC, ProgrammingGhost 
> wrote:
>> I'm a D noob. ".map!(a => a.length)" seems like the lambda is 
>> passed into the  template. ".map!split" just confuses me. What 
>> is split? I thought only types can be after "!". I would guess 
>> split is a standard function but then shouldn't it be 
>> map!(split)?
>>
>>    const wordCount = file.byLine()                  // Read 
>> lines
>>                          .map!split                 // Split 
>> into words
>>                          .map!(a => a.length)       // Count 
>> words per line
>>                          .reduce!((a, b) => a + b); // Total 
>> word count
>
> Do you know C++ templates? C++ func<thing> == D func!(thing).
>
> You can pass anything into a template, not just types. So you 
> are right, "map!split" gives the "split" function into the 
> "map" template and "map!(split)" is the canonical form. D 
> allows you to remove the parens for simple cases, hence 
> "map!split".

Oh I see. Yes I understand C++ templates which is how I guessed 
that. This FEELS UNUSUAL. Because it seems like it is 
.map(!split.map(!(...))).reduce...

As if split.map was the template parameter. How does it know if 
split isn't a class (or if d has them, namespace) and map is a 
static function? Thats why it confused me.


More information about the Digitalmars-d-learn mailing list