digitalmars.D.bugs - [Issue 4661] New: Array of lazy sequence
- d-bugmail puremagic.com (28/28) Aug 17 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4661
- d-bugmail puremagic.com (23/23) Aug 17 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4661
- d-bugmail puremagic.com (17/17) Aug 17 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4661
- d-bugmail puremagic.com (20/20) Aug 17 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4661
- d-bugmail puremagic.com (9/9) Aug 17 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4661
- d-bugmail puremagic.com (10/10) Aug 17 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4661
- d-bugmail puremagic.com (16/16) Aug 17 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4661
- d-bugmail puremagic.com (9/9) Aug 18 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4661
- d-bugmail puremagic.com (17/17) Jun 09 2011 http://d.puremagic.com/issues/show_bug.cgi?id=4661
- d-bugmail puremagic.com (6/6) Jun 09 2011 http://d.puremagic.com/issues/show_bug.cgi?id=4661
- d-bugmail puremagic.com (12/12) Jun 11 2011 http://d.puremagic.com/issues/show_bug.cgi?id=4661
http://d.puremagic.com/issues/show_bug.cgi?id=4661 Summary: Array of lazy sequence Product: D Version: D2 Platform: x86 OS/Version: Windows Status: NEW Keywords: rejects-valid Severity: normal Priority: P2 Component: Phobos AssignedTo: nobody puremagic.com ReportedBy: bearophile_hugs eml.cc Problem in building an array of lazy sequences. This D2 code: import std.algorithm: map; void main() { auto r1 = map!q{a+1}([1, 2, 3]); auto r2 = map!q{a+2}([1, 2, 3]); auto a = [r1, r2]; } Fails, and DMD 2.048 shows: Error: incompatible types for ((r1) ? (r2)): 'Map!(result,int[])' and 'Map!(result,int[])' Additionally, the error message lacks a line number. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 17 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4661 David Simcha <dsimcha yahoo.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED CC| |dsimcha yahoo.com Resolution| |INVALID This bug is invalid because of the way template instantiation from string lambdas works. Instantiating map with q{a + 1} produces a completely different type than map instantiated with q{a + 2}, and therefore storing them in an array should not be possible. Take a look at how Map and std.functional.unaryFun() work. Also, to illustrate my point, note that the following code works: import std.algorithm: map; void main() { auto r1 = map!q{a+1}([1, 2, 3]); auto r2 = map!q{a+1}([1, 2, 3]); auto a = [r1, r2]; } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 17 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4661 Brad Roberts <braddr puremagic.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |REOPENED CC| |braddr puremagic.com Resolution|INVALID | --- Take a step back and rethink your analysis. This example is a straight forward case of int[] to int[] mapping. They _should_ be compatible types. The map function is irrelevant to the types involved. If the result of the map functions differed, then you'd be right. Also, the lack of a line number is a bug regardless of the validity of the operation. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 17 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4661 David Simcha <dsimcha yahoo.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords|rejects-valid |diagnostic Summary|Array of lazy sequence |Array Literal Incompatible | |Type Error Msg Should | |Include Line Number Ok, so this is a legit diagnostic bug. I'll grant you that. However, thinking that Map!("a + 1", Range) and Map!("a + 2", Range) are the same type represents a serious misunderstanding of template alias parameters. The binding of the lambda function to the Map instance happens at compile time, not runtime. Let's try a thought experiment, thinking at the C level. What would happen if Map!"a + 2" were cast to Map!"a + 1" and front() were called? Map!"a + 1".front() would be called. Inlined (probably) in Map!"a + 1".front() is something like return _input.front + 1. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 17 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4661 --- You're miring your logic in the implementation rather than the concept of what map is. Pretend it was implemented as: T[] map(T)(mapfunc, T[]); would we even be having this discussion? -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 17 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4661 No, I'm saying that since the lambda function is bound at compile time, this isn't a bug. It's an intentional design tradeoff. It **can't** be fixed unless the lambda function is bound at runtime instead, which would prevent it from being inlined, prevent implicit instantiation of the lambda function if it's a template, etc. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 17 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4661 Andrei Alexandrescu <andrei metalanguage.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |andrei metalanguage.com 19:58:25 PDT --- I agree that the initial code shouldn't work. This code should: import std.algorithm: map; void main() { auto r1 = map!q{a+1}([1, 2, 3]); auto r2 = map!q{a+2}([1, 2, 3]); auto a = array(chain(r1, r2)); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 17 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4661 Given the way templates work in D, the original code can't work, but I'd like to receive the error line number here. This problem is a good example to show the difference between a structural type system and a nominative one. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 18 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4661 yebblies <yebblies gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |patch CC| |yebblies gmail.com Test case for the error message, and a similar case for associative array initializers: void main() { auto a = [1, null]; auto b = [1 : 1, null : null]; } https://github.com/D-Programming-Language/dmd/pull/99 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jun 09 2011
http://d.puremagic.com/issues/show_bug.cgi?id=4661 *** Issue 5518 has been marked as a duplicate of this issue. *** -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jun 09 2011
http://d.puremagic.com/issues/show_bug.cgi?id=4661 Walter Bright <bugzilla digitalmars.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|REOPENED |RESOLVED CC| |bugzilla digitalmars.com Resolution| |FIXED 12:50:14 PDT --- https://github.com/D-Programming-Language/dmd/commit/86ea84f72c3b82ae034776e58a96054ab97f2138 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jun 11 2011