Thread overview
[Issue 4707] New: auto ref for foreach loops
Aug 22, 2010
David Simcha
Aug 22, 2010
nfxjfg@gmail.com
Aug 22, 2010
David Simcha
Aug 30, 2010
David Simcha
Nov 01, 2013
Martin Nowak
August 22, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4707

           Summary: auto ref for foreach loops
           Product: D
           Version: D2
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: dsimcha@yahoo.com


--- Comment #0 from David Simcha <dsimcha@yahoo.com> 2010-08-21 19:31:14 PDT ---
The following should be possible, with x being ref if possible and non-ref otherwise.  I've toyed with the possibility of adding opApply support to some stuff in std.range and std.algorithm and this is a blocker for doing it at all properly.

void main() {
    foreach(auto ref x; [1, 2]) {}
}

test9.d(2): basic type expected, not auto
test9.d(2): no identifier for declarator int
test9.d(2): found 'auto' when expecting ';'
test9.d(2): found ';' when expecting ')'
test9.d(2): found ')' when expecting ';' following statement

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 22, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4707


nfxjfg@gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |nfxjfg@gmail.com


--- Comment #1 from nfxjfg@gmail.com 2010-08-21 20:33:05 PDT ---
How would this be different from the following (which works)?

void main() {
    foreach(ref x; [1, 2]) {}
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 22, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4707



--- Comment #2 from David Simcha <dsimcha@yahoo.com> 2010-08-21 20:49:02 PDT ---
Because if the range didn't support ref iteration, the foreach loop would work with non-ref iteration rather than producing a compile time error.(In reply to comment #1)
> How would this be different from the following (which works)?
> 
> void main() {
>     foreach(ref x; [1, 2]) {}
> }

If the range didn't support ref iteration, the foreach loop would work with non-ref iteration rather than producing a compile time error.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 30, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4707



--- Comment #3 from David Simcha <dsimcha@yahoo.com> 2010-08-29 21:33:04 PDT ---
Another use case for this is if you are iterating over something that may be expensive to copy.  In these cases, doing foreach(elem; stuff) is inefficient because it produces an unnecessary copy, but foreach(ref elem; stuff) isn't generic enough because it won't work on ranges w/o lvalue elements.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
November 01, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=4707


Martin Nowak <code@dawg.eu> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |code@dawg.eu


--- Comment #4 from Martin Nowak <code@dawg.eu> 2013-11-01 12:17:39 PDT ---
This is still an interesting proposal.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
November 02, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=4707


monarchdodra@gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |monarchdodra@gmail.com


--- Comment #5 from monarchdodra@gmail.com 2013-11-02 03:10:11 PDT ---
(In reply to comment #4)
> This is still an interesting proposal.

Seconded. Thoguh I do seem to remember that another Bug Report about this was open... I did find this interesting thread about it though: http://forum.dlang.org/thread/ceftaiklanejfhodbpix@forum.dlang.org

This proposal has 2 very important (IMO) ramifications:
First, it would allow making "foreach(ref; range)" illegal, if said range
doesn't give ref access. This is a *big* source of bugs.

Second, once we have this, we would be able to write *correct* generic code.
Read this extract from "reduce":
            // For now, just iterate using ref to avoid unnecessary copying.
            // When Bug 2443 is fixed, this may need to change.
            foreach (ref elem; r)
            {

Or "I'm doing wrong, but it seems to work".

So long story short, if we ever hope to have "ref-correct" foreach, we *must* have "auto ref" to make foreach useable in generic code.

This gets a vote from me

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