On 11/11/2013 04:52 AM, Timothee Cour wrote:
The code snippet below doesn't work. Is there a way to make it work?
import std.stdio;
void main(){
writelnIfNonVoid(writeln("ok"));
}
void writelnIfNonVoid(T...)(T a){
static if(T.length)
writeln(a);
}
import std.stdio;
void main(){
writelnIfNonVoid(writeln("ok"));
}
void writelnIfNonVoid(T...)(lazy T a){
static if(T.length){
static if(is(T[0]==void)) a[0];
else write(a[0]);
static if(T.length==1) writeln();
else writelnIfNonVoid(a[1..$]);
}
}
Or, if you care about evaluation order and locking stdout:
import std.stdio;
void main(){
writelnIfNonVoid(writeln("ok"));
}
void writelnIfNonVoid(T...)(lazy T a){
import std.range, std.algorithm, std.conv;
mixin({
string[]
indices=iota(a.length).map!(i=>"a["~to!string(i)~"]").array~"cast(void)0";
string r;
foreach(i,t;T){
if(is(t==void))
indices[i+1]="("~indices[i]~","~indices[i+1]~")";
else r~=indices[i]~",";
}
if(r.length) r="writeln("~r~");";
return r~indices[$-1]~";";
}());
}