Issue 2971 - map no longer works with to
Summary: map no longer works with to
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: x86 Linux
: P2 normal
Assignee: Andrei Alexandrescu
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-05-13 08:14 UTC by Kyle Foley
Modified: 2015-06-09 01:27 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Kyle Foley 2009-05-13 08:14:23 UTC
auto strings = ["1", "2", "3", "4", "5"][];

auto integers = to!(int[])(strings); // fine
auto integers1 = map!("to!(int)(a)")(strings); // fine
auto integers2 = map!(to!(int))(strings); // Error: template instance to!(int) does not match any template declaration
Comment 1 Andrei Alexandrescu 2009-05-13 08:43:30 UTC
This is related to the growing concern that I have that Walter is over-relying on unittests to define D. Essentially right now a feature is defined by the maze of related unittests that were defined for it.

I think this approach is good for verifying that the compiler does the right thing, but is by no means a substitute of sound language and compiler design. This has been long forgotten. Many of the recent bugs show how, as soon as you step outside a narrow path defined by the testsuite, everything bursts in flames. 

To wit, try these replacements. The error messages show how the compiler has no idea what it's doing. It also gives the user no indication of what might be going wrong.

/*A*/ auto integers2 = map!((a) {return to!int(a);})(strings);

/home/andrei/code/dmd/phobos/std/algorithm.d(120): Error: forward reference to type __T2
/home/andrei/code/dmd/phobos/std/algorithm.d(120): Error: cannot implicitly convert expression (null) of type immutable(char)[] to __T2
/home/andrei/code/dmd/phobos/std/algorithm.d(120): Error: forward reference to inferred return type of function call __dgliteral1(cast(__T2)null)
./test.d(111): Error: template instance test.main.Map!(__dgliteral1,immutable(char)[][]) error instantiating

/*B*/ auto integers2 = map!(function int(string a) {return to!int(a);})(strings);

/home/andrei/code/dmd/phobos/std/algorithm.d(94): Error: template std.algorithm.map(fun...) is not a function template
./test.d(9): Error: template std.algorithm.map(fun...) cannot deduce template function from argument types !(int function(immutable(char)[] a)
{
return (immutable(char)[] value = value = a;
) , parseString(cast(const(char)[])value);
}
)(immutable(char)[][])
/home/andrei/code/dmd/phobos/std/algorithm.d(9): Error: template instance std.algorithm.map!(int function(immutable(char)[] a)
{
return (immutable(char)[] value = value = a;
) , parseString(cast(const(char)[])value);
}
) errors instantiating template

We need to change the way the language design is (not) approached, pronto.


Andrei
Comment 2 Andrei Alexandrescu 2010-07-11 18:29:07 UTC
Changeset 1747.