May 16, 2012
Regarding the efforts of removing limitations from D, do you know if there are problems in implementing this oldish enhancement request?

http://d.puremagic.com/issues/show_bug.cgi?id=4086

The idea is to just allow the heap creation of simple structs with no need to define a constructor:


struct Node {
    int data;
    Node* next;
}
void main() {
    Node n1 = Node(10); // OK
    Node n2 = Node(10, null); // OK
}


I am writing many of those stupid struct initializations, it's boring busy work and they don't make the code more readable, just longer, so I'd like D to define them by itself:

this(int data_=int.init, Node* next_=(Node*).init)
pure nothrow @safe {
    this.data = data_;
    this.next = next_;
}

Removing this limit also makes D more uniform with locally-allocated struct construction semantics.

Bye,
bearophile
May 16, 2012
> struct Node {
>     int data;
>     Node* next;
> }
> void main() {
>     Node n1 = Node(10); // OK
>     Node n2 = Node(10, null); // OK
> }

Sorry, I meant:

struct Node {
    int data;
    Node* next;
}
void main() {
    Node n1 = new Node(10); // OK
    Node n2 = new Node(10, null); // OK
}

Bye,
bearophile
May 17, 2012
> struct Node {
>     int data;
>     Node* next;
> }
> void main() {
>     Node n1 = new Node(10); // OK
>     Node n2 = new Node(10, null); // OK
> }

I am sleepy. Third try:

struct Node {
    int data;
    Node* next;
}
void main() {
    Node* n1 = new Node(10); // OK
    Node* n2 = new Node(10, null); // OK
}
May 17, 2012
On 5/17/12, bearophile <bearophileHUGS@lycos.com> wrote:
> snip

Mixin workaround:

import std.conv;

@property string makeCtors(T)()
{
    T t;
    string res;
    foreach (i; 0 .. typeof(t.tupleof).length)
    {
        res ~= "this(typeof(this.tupleof[0.."
                ~ to!string(i+1)
                ~ "]) tup) { this.tupleof[0.."
                ~ to!string(i+1) ~ "] = tup; }\n";
    }

    return res;
}

struct Node
{
    mixin(makeCtors!Node);
    int data;
    Node* next;
}

void main() {
    Node* n1 = new Node(10); // OK
    Node* n2 = new Node(10, null); // OK
}
May 17, 2012
Andrej Mitrovic:

> Mixin workaround:

Yeah, in some cases I have used a similar workaround. Now I'd like to avoid the workaround.

Bye,
bearophile
May 17, 2012
On Wed, 16 May 2012 19:50:25 -0400, bearophile <bearophileHUGS@lycos.com> wrote:

> Regarding the efforts of removing limitations from D, do you know if there are problems in implementing this oldish enhancement request?
>
> http://d.puremagic.com/issues/show_bug.cgi?id=4086

Should be absolutely feasible.

I'd also like to see this work:

struct X
{
   int x;
   this(int x) {this.x = x;}
}

void main(){
  X x; // no ctor needed
  X *xp = new X; // but this is an error!
}

-Steve
Top | Discussion index | About this forum | D home