Ruby in D その2

折角なので出しそびれていたネタを。

import std.c.stdio;

Each!(T) each(T)(T t, T[] ts ...){
    Each!(T) e;
    e.ary_ = t ~ ts;
    return e;
}

struct Each(T){
    T[] ary_;
    Each_!(T) opOr(out T t){
        Each_!(T) e;
        e.ary_ = ary_;
        e.ptr_ = &t;
        return e;
    }
}

struct Each_(T){
    T* ptr_;
    T[] ary_;

    void opOr_r(lazy void dg){
        foreach (T t; ary_){
            *ptr_ = t;
            dg();
        }
    }
}

void main(){
    int i;
    char[] s;
    s ~= "hog";
    each(1, 2, 3) |i| (
        printf("%d\n", i),
        printf("%.*s\n", s ~= "e")
    );
}

カッコが必要なのが気に食わない…