[Issue 2868] New: provide runtime facility for reflection. opDot compiletime dispatch facility
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Apr 21 04:54:42 PDT 2009
http://d.puremagic.com/issues/show_bug.cgi?id=2868
Summary: provide runtime facility for reflection. opDot
compiletime dispatch facility
Product: D
Version: 2.028
Platform: PC
OS/Version: Windows
Status: NEW
Keywords: patch
Severity: normal
Priority: P2
Component: DMD
AssignedTo: bugzilla at digitalmars.com
ReportedBy: davidl at 126.com
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.
--
More information about the Digitalmars-d-bugs
mailing list