<div>Just figured out we can do this. Could this be added to phobos?</div><div><br></div><div>----</div><div>//in std.compiler (or std.traits?)</div><div><div>template Version(alias V){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>mixin(`</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>version(`~V~`){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>enum Version=true;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>else </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>enum Version=false;</div><div>`);</div><div>}</div></div><div>----</div><div>
<div><br></div></div><div>usage:</div><div><br></div><div>----</div><div>import std.compiler;</div><div><div>void main(){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>static if(!Version!"assert")</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>writeln("not assert");</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>static if(Version!"OSX" && !Version!"D_NoBoundsChecks" || !Version!"assert")</div>
<div> {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>writeln("special code");</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div>}</div></div><div>
----</div><div><br></div><div>without this, we have to resort to something ugly, not dry, error prone:</div><div><br></div><div>----</div><div><div>//pollutes namespace, as we can't define version=temp inside a function</div>
<div>version(OSX)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>version(D_NoBoundsChecks)</div><div> {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>else</div><div> {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>version=temp;//need to make sure temp doesn't clash with other version identifiers / symbols</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div>}</div><div>else</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>version(assert)</div><div> {</div><div>
<span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>else</div><div> {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>version=temp;//NOT DRY: repeats temp</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div>}</div><div><br></div><div>void main()</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>version(assert)</div>
<div> {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>else</div><div> {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>writeln("not assert");</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>version(temp) // here we use it</div><div> {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>writeln("special code");</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div>}</div></div><div><div>----</div><div><br></div><div><br></div><div>Likewise, with debug:</div><div>----</div><div><div>template Debug(alias V){</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>import std.traits:isIntegral;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>static if(!isIntegral!(typeof(V))){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>mixin(`</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>debug(`~V~`){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>enum Debug=true;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>else </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>enum Debug=false;</div><div>`);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>else{</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>import std.conv:to;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>mixin(`</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>debug(`~V.to!string~`){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>enum Debug=true;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>else </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>enum Debug=false;</div><div>`);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>/+</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> //NOTE:maybe a dmd bug but this didn't work</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> debug(V)</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> enum Debug=true;</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> else </div><div><span class="Apple-tab-span" style="white-space:pre"> </span> enum Debug=false;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> +/</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>}<span class="Apple-tab-span" style="white-space:pre"> </span></div><div>}</div></div><div><div>----</div><div><br></div><div><br></div><div>usage:</div><div>
----</div><div><div>void main(){</div><div> import std.compiler;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>static if(Debug!2){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>writeln("debug>=2");</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>static if(Debug!"foo"){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>writeln("debug=foo");</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div>}</div></div><div><div>----</div><div><br></div><div></div></div><div></div></div><div></div></div>