Three Unlikely Successful Features of D

Rene Zwanenburg renezwanenburg at gmail.com
Tue Mar 20 18:45:41 PDT 2012


And there goes the formatting, here's a pastebin version:
http://pastebin.com/dHdiG0ce

On Wednesday, 21 March 2012 at 01:41:27 UTC, Rene Zwanenburg 
wrote:
> On Tuesday, 20 March 2012 at 19:02:16 UTC, Andrei Alexandrescu 
> wrote:
>> I plan to give a talk at Lang.NEXT 
>> (http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012) 
>> with the subject above. There are a few features of D that 
>> turned out to be successful, in spite of them being seemingly 
>> unimportant or diverging from related consecrated approaches.
>>
>> What are your faves? I have a few in mind, but wouldn't want 
>> to influence answers.
>>
>>
>> Thanks,
>>
>> Andrei
>
> I've seen most of D's cool features mentioned, but I believe 
> nobody mentioned mixins yet. Mixins are messy to maintain, but 
> together with CTFE they can be used to create some really neat 
> code if used properly.
>
> One of the first things I wrote while learning D is a vector 
> class. In GLSL vectors can be 'swizzled', for example:
> vec3(1, 2, 3).zyx == vec3(3, 2, 1);
> Swizzles are often useful in graphics or physics code. I don't 
> know of any non-shading language that allows me to use swizzle 
> syntax. As the following code shows, it's quite easy to do in D:
>
>
> module main;
>
> import std.stdio;
> import std.process;
> import std.conv;
>
>
> int main(string[] argv) {
>   alias Vec!4 Vec4;
>   Vec4 v = Vec4(1, 2, 3, 4);
>
>   writeln(v.bgra); // Prints Vec!(4)([3, 2, 1, 4])
>   writeln(v.rg); // Prints Vec!(2)([1, 2])
>
>   return 0;
> }
>
> private immutable (char[][]) elementNames = [['x', 'y', 'z', 
> 'w'], ['r', 'g', 'b', 'a'], ['s', 't', 'p', 'q']];
>
> struct Vec(size_t size) {
>   alias size Size;
>
>   mixin(generateConstructor(Size));
>
>   mixin(generateProperties(Size));
>
>   auto opDispatch(string s)() {
>     mixin(generateSwizzle(s));
>   }
>
>   float v[Size];
> }
>
> private string generateConstructor(size_t size) {
>   string constructorParams;
>   string constructorBody;
>
>   foreach(i; 0..size) {
>     string paramName = "v" ~ to!string(i);
>     constructorParams ~= "float " ~ paramName ~ "=0,";
>     constructorBody ~= "v[" ~ to!string(i) ~ "] = " ~ paramName 
> ~ ";";
>   }
>
>   return "this(" ~ constructorParams[0..$-1] ~ "){" ~ 
> constructorBody ~ "}";
> }
>
> private string generateProperties(size_t size) {
>   string props;
>
>   foreach(names; elementNames) {
>     foreach(i, name; names[0..size]) {
>       props ~= "@property float " ~ name ~ "() const { return 
> v[" ~ to!string(i) ~ "]; }";
>       props ~= "@property void " ~ name ~ "(float f) { v[" ~ 
> to!string(i) ~ "] = f; }";
>     }
>   }
>
>   return props;
> }
>
> private string generateSwizzle(string elements) {
>   string swizzleImpl = "return Vec!" ~ 
> to!string(elements.length) ~ "(";
>
>   foreach(e; elements) {
>     swizzleImpl ~= e ~ ",";
>   }
>
>   return swizzleImpl[0..$-1] ~ ");";
> }




More information about the Digitalmars-d mailing list