Template currying
ZombineDev via Digitalmars-d
digitalmars-d at puremagic.com
Thu May 5 21:53:39 PDT 2016
On Thursday, 5 May 2016 at 20:17:08 UTC, Yuxuan Shui wrote:
> So I was working on a parser combinator library, where the
> combinators take parsers as template argument. It works well
> until recently I decided to change the parsers so they would
> take Ranges instead of just strings.
>
> The combinator used to look like:
>
> template Comb(alias parser1, alias parser2)
>
> Now it looks like
>
> template Comb(alias parser1, alias parser2, Range)
>
> And I want to have the compile deduce the Range template
> arguments, so I don't need to change the code that uses them.
> But I found out it's hard to partially instantiate templates.
>
> It's OK to do that at the call site, e.g. Comb!(a, b)(range)
> works without specifying the Range. But sometimes I want to
> alias the result parser so I can use it at multiple places, but
>
> alias new_parser = Comb!(a, b);
>
> doesn't work.
>
> I need either to define Comb differently:
>
> template Comb(alias p1, alias p2) {
> template Comb(Range) {
>
> or not use alias:
>
> template new_parser(alias p1, alias p2){
> alias new_parser(Range) = Comb!(p1, p2, Range);
> //Something like this, not tested
> }
>
> I think it would be really nice if alias can be automatically
> translated to the latter one. Or maybe we can have something
> like
>
> template Curry(alias tmpl, Args1...) {
> alias Curry(Args2...) = tmpl!(Args1~Args2); //Pseudocode
> }
>
> in the phobos.
alias can automatically introduce template arguments only for
function literals:
alias add = (a, b) => a + b;
add has two implicit template arguments:
auto sum = add(4, 3.17);
deduced to int and double in the case above.
Actually the alias add refers to the symbol of an automatically
generated template:
alias add = _add_generated;
template _add_generated(T1, T2)
{
auto _add_generated(T1 a, T2 b)
{
return a + b;
}
}
The closest thing to getting the compiler to generate something
like the above template is ApplyLeft/ApplyRight from std.meta:
http://dlang.org/phobos/std_meta#.ApplyLeft
More information about the Digitalmars-d
mailing list