[Issue 4264] New: Various std.algorithm.map problems

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Jun 2 17:21:40 PDT 2010


http://d.puremagic.com/issues/show_bug.cgi?id=4264

           Summary: Various std.algorithm.map problems
           Product: D
           Version: unspecified
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: nobody at puremagic.com
        ReportedBy: bearophile_hugs at eml.cc


--- Comment #0 from bearophile_hugs at eml.cc 2010-06-02 17:21:38 PDT ---
This D2 code works with DMD v2.046:

import std.stdio: writeln;
import std.algorithm: array, map;
void main() {
    int[] arr = [1, 2, 3];
    auto r1 = map!("a * a")(arr);
    writeln(array(r1));

    auto f = (int x){ return x * x; };
    auto r2 = map!(f)(arr);
    writeln(array(r2));
}

And prints:

1 4 9
1 4 9

--------------------------

But this program:

import std.stdio: writeln;
import std.algorithm: array, map;
void main() {
    int[] arr = [1, 2, 3];
    auto r3 = map!((x){ return x * x; })(arr);
    writeln(array(r3));
}


Generates the errors at compile-time:
...\src\phobos\std\algorithm.d(127): Error: forward reference to inferred
return type of function call __dgliteral1(0)
test.d(118): Error: template instance test.main.Map!(__dgliteral1,int[]) error
instantiating
test.d(5):        instantiated from here: map!(int[])
test.d(5): Error: template instance test.main.map!(__dgliteral1).map!(int[])
error instantiating

--------------------------

And this program:

import std.stdio: writeln;
import std.algorithm: array, map;
void main() {
    int[] arr = [1, 2, 3];
    auto r4 = map!((int x){ return x * x; })(arr);
    writeln(array(r4));
}


Generates the errors at compile-time:
test.d(5): Error: delegate std.algorithm.__dgliteral1 cannot access frame of
function __dgliteral1
test.d(5): Error: delegate std.algorithm.__dgliteral1 cannot access frame of
function __dgliteral1
test.d(5): Error: template instance test.main.map!(delegate int(int x)

{

return x * x;

}

) error instantiating

--------------------------

This D2 code works:

import std.stdio: writeln;
import std.algorithm: filter, array, map;
void main() {
    int[] arr = [1, 2, 3, 4, 5];
    auto r1 = array(filter!((x){ return x >= 3; })(arr));
    auto r2 = map!("a * a")(r1);
    writeln(array(r2));
}


And prints:

9 16 25

--------------------------

While this code:

import std.stdio: writeln;
import std.algorithm: filter, array, map;
void main() {
    int[] arr = [1, 2, 3, 4, 5];
    auto r1 = filter!((x){ return x >= 3; })(arr);
    auto r2 = map!("a * a")(r1);
    writeln(array(r2));
}


Generates the errors at compile-time:
...\src\phobos\std\algorithm.d(126): Error: struct
std.algorithm.Map!(result,Filter!(__dgliteral1,int[])).Map inner struct Filter
cannot be a field
...\src\phobos\std\algorithm.d(118): Error: template instance
std.algorithm.Map!(result,Filter!(__dgliteral1,int[])) error instantiating
test.d(6):        instantiated from here: map!(Filter!(__dgliteral1,int[]))
...\src\phobos\std\algorithm.d(6): Error: template instance
std.algorithm.map!("a * a").map!(Filter!(__dgliteral1,int[])) error
instantiating

--------------------------

This code:


import std.stdio: writeln;
import std.algorithm: array, map;
struct Range {
    int stop;
    int opApply(int delegate(ref int) dg) {
        int result;

        for (int i = 0; i < stop; i++) {
            result = dg(i);
            if (result)
                break;
        }

        return result;
    }
}
void main() {
    auto r = map!("a * a")(Range(6));
    writeln(array(r));
}



Generates the errors at compile-time:
...\src\phobos\std\algorithm.d(118): Error: template instance
Map!(result,Range) does not match template declaration Map(alias fun,Range) if
(isInputRange!(Range))
...\src\phobos\std\algorithm.d(118): Error: Map!(result,Range) is used as a
type
...\src\phobos\std\algorithm.d(120): Error: function expected before (), not
void of type void
...\src\phobos\std\algorithm.d(18): Error: template instance
std.algorithm.map!("a * a").map!(Range) error instantiating
test.d(18): Error: variable test.main.r voids have no value
test.d(18): Error: expression map((Range(6))) is void and has no value


A map() from a standard library must work with that Range() too because I have
structs/classes that define opApply and I want to use map and filter on them
too.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list