Template currying

Yuxuan Shui via Digitalmars-d digitalmars-d at puremagic.com
Thu May 5 13:17:08 PDT 2016


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.


More information about the Digitalmars-d mailing list