Andrei Alexandrescu Wrote:

> Eldar Insafutdinov wrote:
> > Right now we are working on a next QtD version. We dropped support
> > for D1, it is D2 only. I believe Qt suits all your requirements very
> > well. It's performant - we try to emulate as many C++ types using D
> > structs as possible, for drawing purposes. So types like QPoint - are
> > D structs and for drawing lines you can pass D array directly. No
> > perfromance hit. But of course we cannot avoid all of them, it is
> > still a binding. Regarding the license, Qt itself is LGPLed, QtD is
> > boost. you don't have to put any attribution. About stability of APIs
> > - Qt4 is stable within the major version. At the moment we are
> > working on signals/slots implementation. It is mostly complete, but
> > syntax may change. It will hopefully change once and stay forever.
> > 
> > I would say that QtD is in the state close to that of D2, almost
> > there, but not quite ready yet. But we intend to release the next
> > version, which will be ready to use earlier than D2 anyway, I would
> > say within a month.
> 
> I salute the decision of going with D2, as well as that of using the 
> Boost license. If there is anything in the language that prevents you 
> from getting things done, please let us know. The availability of QtD 
> concurrently with that of D2 will hopefully push both forward.
> 
> Andrei

Thanks for cooperation. I don't want to sound like I've given the right to ask 
for features, because I am working on a particular D project. But at the same 
time, indeed, while working on this project I found many things that I would 
like to be improved. Here are some of them:

1) You may know the concept of signals and slots in Qt. Consider the following 
snippet:

class Test : QObject
{
    mixin Signal!("signal_1(string)");    

    mixin Slot!("slot_1(string str)");    
    void slot_1(string str)
    {
        writefln("slot_1 invoked with ~ " str);
    }

    mixin Q_OBJECT;
}

In Qt objects, that inherit from QObject are capable of having signals and 
slots and participate in connections. In the current scheme mixins of Signal 
and Slot template mix some static information into the class. The class is then 
scanned when Q_OBJECT template is mixed in and the proper meta-information is 
generated to register signals and slots in the Qt type system.
As you see, this declaration is a bit ugly. In particular defining a slot 
requires to duplicate its signature in a mixin. What would really be awesome is 
a mechanism allowing something like:

    @Slot
    void slot_1(string str)
    {
        writefln("slot_1 invoked with " ~ str);
    }
I.e we need annotations. But I am not sure how this will work. One of the 
possible solutions will be that @Slot expands into mixin Slot!(symbol, 
AnnotationArg1, ...).  

But I have to say, that expanding annotations into mixins might not be a good 
idea. Annotations could rather be implemented by aggregating the data with 
symbols instead. I think it will be more clean than the current scheme we chose 
with mixing in and scanning data. Instead you have some data aggregated with 
declarations. Using compile time reflection you iterate over the symbols, look 
for annotations, extract them and do whatever you want with it. Say if we 
introduce traits(getAnnotations, symbol) feature and it will return a construct 
like StaticTuple!(SealedTuple!("annotationName", AnnotationArg1, ...), ...); it 
will be sufficient. We should discuss it more anyway.

2) Second problem in this declaration is that in order for Q_OBJECT template to 
see all signal and slot declaration you have to put the mixin after all of 
them, like in example. This is absolutely a stupid requirement. Again it could 
be solved either by annotations:

@Q_OBJECT
class Test : QObject
{ ... }

which will again expand into a mixin in the class body after all of the 
declarations,
or by the feature you suggested a while ago - mixin (Derived), which will mix 
in some stuff to all sub-classes of QObject automatically. 

3) To continue the first paragraph signals should also get some love. If we 
have this for slots:

@Slot
void slot_1(string str)
{
...
}

I would also like to have something like:

@Signal
void signal_1();

What it will effectively means, is that we are declaring a method without a 
body and aggregate some meta data with it using annotation. The body for the 
signal instead of being generated by the mixin Signal!(...) like in the first 
snippet, will be generated at the very end by mixin Q_OBJECT (or with a mixin 
Derived)

Essentially we should allow separating function declaration and definition to 
allow that, currently dmd just asserts trying to compile this:

class Test
{
   void foo();
   void foo() {}
}

So the final refined declaration of a class with a signal and a slot from the 
first snippet using proper annotations, mixin Derived in the base class and 
allowing for separating function declaration and definition will look like:

class Test : QObject
{
    @Signal
    void signal_1(string);    

    @Slot
    void slot_1(string str)
    {
        writefln("slot_1 invoked with " ~ str);
    }
}

Much nicer, isn't it?

4) __traits should access the data mixed in by template mixins. Otherwise we 
have to use dirty template trickery.

5) As QtD uses templates extensively, it would be really helpful if the 
compiler gave better error messages about template instantiation errors. 
Specifically, static assert(false, ) is often used to give the user a message 
about the error but it is sometimes very hard to find the place of outer 
instantiation. Propagating the FILE_ and __LINE__ to nested instantiations is 
impractical. There has been this patch by Don for a long time that fixes the 
'static assert' issue: http://d.puremagic.com/issues/show_bug.cgi?id=2816. We'd 
really like to have it applied. See also 
http://d.puremagic.com/issues/show_bug.cgi?id=2902, 
http://d.puremagic.com/issues/show_bug.cgi?id=2510.

6) Various, various compiler bugs. I'm not joking here, I hit dmd bugs every 
single day I work on qtd. It makes it very difficult to cut down to sensible 
testcases, because of the size of the library. I filed some bugs, I used all my 
votes in bugzilla, but neither of those got any update within last 2 months. 
That's a pity. I am sure many other people have similar experience.

The main one is probably forward references bug. That's why I have to use 
patched version of dmd (done not by me). Work on it is still in progress, and 
when the author of the patches finishes it and submits them to the bugzilla, we 
would need apply them somehow, as otherwise official dmd will not compile QtD.

Reply via email to