Partial template application

Andrej Mitrovic andrej.mitrovich at gmail.com
Mon Jan 31 12:52:24 PST 2011


On 1/31/11, bearophile <bearophileHUGS at lycos.com> wrote:
> Walter has tried to unify the two, using a syntax like:
> void foo(int x, static int y, int z) {}
> That's equivalent to:
> void foo(int y)(int x, int z) {}
>
> But the legend says he has found unspecified implementation difficulties, so
> the idea was abandoned. One purpose of D design is to avoid excessive
> compiler complexity.
>

Well I do think there should be a difference between compile time and
runtime arguments, so I'd keep the current syntax rather than mix the
two. Perhaps D3 could have a form of static expressions:

import std.typecons, std.functional, std.array;
auto optArg(alias pred, alias fn, Range)(Range r) {
    // same as before
}

void main() {
   alias static optArg!"a < b" minArg;
   alias static minArg!"a" foo;
   assert(foo([5, 2, 1, 3]) == tuple(1, 1));
}

and then we could have:

import std.stdio, std.typetuple, std.algorithm, std.traits, std.range;
void main()
{
    int[] arr1 = [ 1, 2, 3, 4 ];
    int[] arr2 = [ 5, 6 ];
    auto squares = map!("a * a")(chain(arr1, arr2));

    //~ alias staticMap!(Unqual, int, const int, immutable int) T;
    alias static map!(Unqual, int, const int, immutable int) T;
}

I'm not sure how that would work, I'm just throwing ideas in the air. :)


More information about the Digitalmars-d mailing list