On 4/24/22 18:40, Alain De Vod wrote:

> I think this has something to do with popFront

This type violates a fundamental rule: Containers and ranges are separate concepts. Your List is a container, not a range. I changed your code by moving the range functions to a Range struct that is created by opSlice():

class List {
    Node * root=null;
    this(int[] AR){foreach(i ; AR)pushfront(i);}

    auto opSlice() {
      return Range(root);
    }

    static struct Range {
      Node * root_;

      bool empty() const {return !root_;}
      void popFront() {root_=root_.next;}
      float front() const {return root_.element;}
    }

    void pushfront(int element) {
      Node * newnode=new Node();
      newnode.element=element;
      newnode.next=root;
      root=newnode;
    }
}//List

The foreach loop implicitly calls opSlice() and it all works.[1] When you want a range, you can call opSlice indirectly by using [] after the object:

    import std.algorithm;
    writeln(l[].map!(e => e * 2));

Ali

[1] As reported recently by Steven Schveighoffer, this information is missing in my book: https://bitbucket.org/acehreli/ddili/issues/33/add-additional-foreach-mechanism-to-range

Reply via email to