Another foreach idea.
zadok
zadokallen at yahoo.com
Wed Jun 7 23:20:34 PDT 2006
Kirk McDonald wrote:
> Kirk McDonald wrote:
>> In short, all you need is a "range" function that returns an array of
>> integers, or (alternately) a generator... something like this:
>>
>
> Oh! I did some thinking and improved it a little. It's a struct now, so
> it doesn't need to touch the GC. And factory functions are maybe a
> little more clear than static opCalls (also, there are two, now).
>
> private import std.stdio;
>
> struct range_struct {
> public:
> int m_start, m_end, m_step;
>
> // Compares whether i has reached the end
> private bool cmp(int i) {
> if (m_step > 0 && i < m_end) return true;
> else if (m_step < 0 && i > m_end) return true;
> else return false;
> }
>
> int opApply(int delegate(inout int) dg) {
> int result = 0;
> for (int i=m_start; this.cmp(i); i+=m_step) {
> result = dg(i);
> if (result) break;
> }
> return result;
> }
> }
>
> range_struct range(int start, int end, int step=1) {
> range_struct r;
> r.m_start = start;
> r.m_end = end;
> r.m_step = step;
> return r;
> }
>
> range_struct range(int end) {
> return range(0, end, 1);
> }
>
> void main() {
> foreach(i; range(10)) {
> writefln("%s", i);
> }
> foreach(j; range(10, 20)) {
> writefln("%s", j);
> }
> foreach(k; range(0, 10, 2)) {
> writefln("%s", k);
> }
> }
>
> -Kirk McDonald
make your struct predefined in the language with the syntaxic sugar
start..end
and this would be fine to compile:
range r = 0..9;
assert(r == range(0, 9));
r = range(0, 9, 2);
char[] str = "0123456789";
assert(str[r] == "02468");
More information about the Digitalmars-d
mailing list