D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 2868 - provide runtime facility for reflection. opDot compiletime dispatch facility
Summary: provide runtime facility for reflection. opDot compiletime dispatch facility
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: x86 Windows
: P2 enhancement
Assignee: Walter Bright
URL:
Keywords: patch
Depends on:
Blocks:
 
Reported: 2009-04-21 06:54 UTC by david
Modified: 2015-06-09 01:27 UTC (History)
1 user (show)

See Also:


Attachments
the patch for the two semantic proposals (4.85 KB, patch)
2009-04-21 06:56 UTC, david
Details | Diff

Note You need to log in before you can comment on or make changes to this issue.
Description david 2009-04-21 06:54:49 UTC
1. modify the D2 opDot semantic from forwarding to compiletime opDot function calling
2. modify the D2 __traits(getallmembers) to return tuples.
in the patch, it's currently organized as:
(member_name, member_symbol) pair 

Thus, by the 1st change we can have following code working:
import std.stdio;
class c
{
    
    B opDot(U:immutable(char)[], T...)(U methodname, T t)
    {
    	writefln("god it works ", methodname);
      return new B();
    }
    void opAdd(int j)
    {
      
    }
    void test()
    {
    }
}

class B
{
  int i;
  B opAssign(int k){
    i=k;
    return this;
  }
}

void extmethod(c v,int j){writefln("extmenthod!");}

char[] v1;

void func(char[] v, ...){}

void main()
{
   c v=new c;
   v.opDot("jesus", 3,4);
   v.test();
   v.dynamicmethod(3,4);
   //v.qq(1,2) = 5;
   writefln((v.qq(1,2) = 5).i);
   v.extmethod(3);
   
}

By the second change we can have the following code working:
import std.stdio;
class D
{
    int tt;
    alias tt this;
    this() { }
    ~this() { }
    int foo(int) { tt++;writefln("god you called me?");return 0; }
    void foo() { }
    int vvv;
}

class M:D
{
  void callfunc()
  {
  pragma(msg, __traits(allMembers, D)[0]);
  pragma(msg, __traits(allMembers, D)[2]);
  pragma(msg, __traits(allMembers, D)[6]);
      __traits(allMembers, D)[7](1);
      writefln("tt should be 1 now ",tt);
  }
}

void main()
{
    auto b = ["__ctor","__dtor","foo","toString","toHash","opCmp","opEquals","Monitor","factory"];
    M subd= new M;
		subd.callfunc();
    writefln(subd.tt);
}

The second change provides richer functionality while we can still achieve the old result by templates wrapping the __traits.

original opDot semantic can be simulated by the 1st and 2nd change together.

Thus I think the semantic change provides richer functionality while on the other hand we can still mock the old behavior.
Comment 1 david 2009-04-21 06:56:16 UTC
Created attachment 333 [details]
the patch for the two semantic proposals

here's the patch against dmd2.028
Comment 2 david 2009-04-21 07:00:26 UTC
It's an enhancement.
Comment 3 Don 2010-05-07 00:23:23 UTC
opDispatch was added in DMD2.037.