Function literals -- strange behavior

Denis Koroskin 2korden at gmail.com
Thu Dec 4 12:27:05 PST 2008


On Thu, 04 Dec 2008 23:08:51 +0300, Justin <mrjnewt at hotmail.com> wrote:

> Ahh, I thought it would some stupid oversight on my part. This works:
>
> module functionliteral;
>
> import std.stdio;
>
> static void main() {
>
> 	int[] values = [1,2,4,8];
> 	writefln(Reduce(values, function int(int x, int y) { return x + y; }));
> 	writefln(Reduce(values, function int(int x, int y) { return x * y; }));
> }
>
> static int Reduce(int[] values, int function(int x, int y) operation) {
> 	int total = values[0];
> 	foreach (int v; values[1..$])
> 		total = operation(total,v);
> 	return total;
> }
>

Shorter way:

import std.stdio;
import std.algorithm;

void main()
{
     auto values = [1,2,4,8];

     writefln(reduce!("a + b")(0, values));
     writefln(reduce!("a * b")(1, values));
}

or

import std.stdio;
import std.algorithm;

int add(int a, int b)
{
     return a + b;
}

int mul(int a, int b)
{
     return a * b;
}

void main()
{
     auto values = [1, 2, 4, 8];
     writefln(reduce!(add)(0, values));
     writefln(reduce!(mul)(1, values));
}

but the following doesn't work:

import std.stdio;
import std.algorithm;

void main()
{
     auto values = [1, 2, 4, 8];
     writefln(reduce!((int a, int b) { return a * b; })(1, values));
}

It used to work, IIRC, but now it prints '0'. Does anybody know if it is  
supposed to work?



More information about the Digitalmars-d mailing list