On Tuesday, 2 August 2022 at 12:39:41 UTC, pascal111 wrote:
>On Tuesday, 2 August 2022 at 04:06:30 UTC, frame wrote:
>On Monday, 1 August 2022 at 23:35:13 UTC, pascal111 wrote:
>This is the definition of "filter" function, and I think it called itself within its definition. I'm guessing how it works?
It's a template that defines the function called "Eponymous Templates":
https://dlang.org/spec/template.html#implicit_template_properties
A template generates code, it cannot be called, only instantiated.
The common syntax is just a shortcut for using it. Otherwise you would need to write filter!(a => a > 0).filter([1, -1, 2, 0, -3])
. Like UFCS, some magic the compiler does for you.
Instantiation seems some complicated to me. I read "If a template contains members whose name is the same as the template identifier then these members are assumed to be referred to in a template instantiation:" in the provided link, but I'm still stuck. Do you have a down-to-earth example for beginners to understand this concept?
A template is conceptually like a macro with parameters in C. An instantiation is like the using of the macro in your C program. The fundamental difference is, that the template is syntactically and semantically linked to the language. In C, the preprocessor was just a textual replacement done before the proper compilation. This meant that there are things that you couldn't do in the pre-processor (like #if sizeof(int)==4
) and (horrible) things that never should have been possible (I used to use the C pre-processor with other languages like AutoLISP and dBase III).