On 03/30/2011 04:29 PM, Steven Schveighoffer wrote:
On Wed, 30 Mar 2011 10:06:26 -0400, spir <denis.s...@gmail.com> wrote:

Hello,

I was trying std.container's SList and noticed foreach iteration works for
it, while it defines neither opApply, nore a (complete) input range
interface. But it does implement a parameter-less opSlice, which maps to "l2
= l1[];". More precisely, SList (as other container types) defines a 'Range'
struct type which is the return type of opSlice().
TDPL states this method should automagically deal as standard traversal for
foreach (when no opApply or range interface is defined on the collection to
be traverseditself, I guess). But the magic did not work up to very recently.

Apparently, it works for SList all the way back to at least 2.050, but I'm not
sure why. It doesn't work for a basic case in 2.052:

struct S
{
struct R
{
@property int front() { return 0;}
void popFront() {}
@property bool empty() const { return true;}
}

R opSlice() { return R();}
}


void main()
{
S s;
foreach(int n; s) {}
}


testopslice.d(19): Error: no property 'opApply' for type 'S'
testopslice.d(19): Error: opApply() function for S must return an int

Strange, I just tried it on a custom, trivial, collection type --precisely to verify that it does not work only for the standard SList-- and it worked fine (dmd 2.051 on ubuntu). But now I cannot reproduce this success anymore! get the same error as you. Will go on trying and tell you if anything changes.

Anyway, if the feature is still unimplemented, why and how does foreach work on SList. ???

Denis
--
_________________
vita es estrany
spir.wikidot.com

Reply via email to