Consistency, Templates, Constructors, and D3

foobar foo at bar.com
Wed Aug 29 08:33:40 PDT 2012


On Wednesday, 29 August 2012 at 15:07:42 UTC, F i L wrote:
> Actually, now that I think about it, there's an potentially 
> better way. Simply have static analysis do the work for us:
>
> class A
> {
>   int a;
>   this new() {
>     // if 'this = ...' is found before 'this.whatever' then
>     // the automatic allocation is overriden. So we have no need
>     // for any kind of @noalloc/@alloc() distinction.
>
>     // More importantly, because allocation is type specific, we
>     // strip this out when calling it from a derived class (see 
> B)
>
>     this = GC.alloc(A); // this stripped when called from 
> B.new()
>     this.a = ...;
>   }
> }
>
> class B : A
> {
>   int b;
>   this new() {
>     super.new(); // use A.new() except for allocation
>     this.b = ...;
>   }
> }
>
>
> Basically what's happening is two functions are built out for 
> each class constructor which defines a 'this = ...': one with 
> the allocation stuff, and one without. When a derived class 
> calls the super classes constructor, it's calling the one built 
> without the allocation stuff.
>
> There could also be some kind of cool tricks involved. For 
> instance of you use 'typeof(this)' with 'GC.alloc()' (instead 
> of 'A'), then it could keep the allocation stuff and the 
> super.new() constructor and use the allocation logic, but still 
> allocate the size appropriate for type 'B' when it's called:
>
> class A
> {
>   this new() {
>     if (condition) {
>       this = GC.alloc(typeof(this));
>     }
>     else {
>       this = malloc(typeof(this));
>     }
>     ...
>   }
> }
>
> class B
> {
>   this new() {
>     super.new(); // same allocation rules as A
>     ...
>   }
> }
>
> However, that last part's just a side thought, and I'm not sure 
> if it would really work, or what the implementation costs would 
> be.

This looks way too complicated and also quite limited.
I still haven't got an answer regarding - why impose typeof(this) 
as the return type of new()? I even provided an real-world use 
case where this is undesired!

As I said before, please read:
http://www.drdobbs.com/javas-new-considered-harmful/184405016#

This was implemented in languages since the 80's, e.g smalltalk.


More information about the Digitalmars-d mailing list