Few recent dmd pull requests

bearophile via Digitalmars-d digitalmars-d at puremagic.com
Thu Jun 26 03:38:53 PDT 2014


For people that are not following closely what's happening in 
GitHub, there are some nice or very nice patches waiting to be 
fixed and/or accepted, among the last ones:

--------------------

This proposes a __traits(documentation, expr):
https://github.com/D-Programming-Language/dmd/pull/3531

Something similar is used in Python and Lisp, it allows to 
introspect the comments. It's useful for various generative 
purposes.

One quirk of this implementation, that I am not sure about:

>Comments will only be available if DMD is invoked with the "-D" 
>flag. If no comment is available for expr, __traits(comment, 
>expr) evaluates to the empty string.<

--------------------

Optional monitors for class instances, including a fallback:
https://github.com/D-Programming-Language/dmd/pull/3547

It was discussed in this newsgroup too. Beside the little save in 
memory (probably small), monitors today are not much appreciated. 
Andrei seemed to agree with this idea.

--------------------

https://github.com/D-Programming-Language/dmd/pull/3615

Will allow very handy, more DRY and less bug-prone like this:

// static array type
int[$]   a1 = [1,2];    // int[2]
auto[$]  a2 = [3,4,5];  // int[3]
const[$] a3 = [6,7,8];  // const(int[3])

// dynamic array type
immutable[] a4 = [1,2];    // immutable(int)[]
shared[]    a5 = [3,4,5];  // shared(int)[]
// partially specified part is unqualified.

// pointer type
auto*  p1 = new int(3);  // int*
const* p2 = new int(3);  // const(int)*

// mixing
auto[][$] x1 = [[1,2,3],[4,5]];  // int[][2]
shared*[$] x2 = [new int(1), new int(2)];  // shared(int)*[2]


A comment by Walter:

>My reservation on this is I keep thinking there must be a better 
>way than [$].<

--------------------

https://github.com/D-Programming-Language/dmd/pull/3638

Allows to write code like:


void main() {
     import std.algorithm;
     alias sqr = a => a ^^ 2;
     auto r = [1, 2, 3].map!sqr;
}


Currently you need to write:

alias F(alias f) = f;
void main() {
     import std.algorithm;
     alias sqr = F!(a => a ^^ 2);
     auto r = [1, 2, 3].map!sqr;
}

--------------------

https://github.com/D-Programming-Language/dmd/pull/3679

This introduces __traits(valueRange, expr), and I think it 
introduces range values to the ?: expressions too.

The __traits(valueRange, expr) is meant to be useful for 
debugging range values, that is meant to be improved in future. 
Currently this patch seems stalled because Lionello seems to not 
provide few small things Walter has asked.

--------------------

https://github.com/D-Programming-Language/dmd/pull/3680


It should fix this bug:

void main() {
     int[int][int] a1 = cast()[1: [2: 3]]; // workaround
     int[int][int] a2 =       [1: [2: 3]]; // error
}


And will allow you to write:

void main() {
     import std.bigint;
     BigInt[] data = [-5, 6, 9];
}


Currently in D you have write this:

void main() {
     import std.bigint;
     auto data = [BigInt(-5), BigInt(6), BigInt(9)];
}


Or this (writing -5.BigInt is generally not a good idea):

void main() {
     import std.bigint;
     auto data = [BigInt(-5), 6.BigInt, 9.BigInt];
}

--------------------

Bye,
bearophile


More information about the Digitalmars-d mailing list