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

Reply via email to