Review of std.signal

Martin Nowak code at dawg.eu
Thu Jan 23 09:16:04 PST 2014


On 01/06/2014 11:13 AM, Vladimir Panteleev wrote:
>
> IMO, the effort to disallow third parties to "emit" signals on your
> object by far exceeds its worth.
>
> For this purpose, you have needed:
> - string mixins
>    - ...which declare, by convention, a field with a name not explicitly
> given by the user
>    - ...with a workaround for when they don't work
> - an enumeration type
> - two different signal struct types
> - a boatload of documentation
> - a nontrivial cognitive effort on the user to grok all of the above
>
> This little feature steals too much focus, and IMO is not worth it.

I absolutely agree. Ideally the module std.signal would consists of a 
template struct with 3 overloaded methods.

struct Signal(Args...)
{
     void connect(void delegate(Args) dg);
     void connect(WeakDelegate!(Args) dg);

     void disconnect(void delegate(Args) dg);
     void disconnect(WeakDelegate!(Args) dg);

     void emit(Args);
}

Still, looking at the documentation 
(https://vhios.dyndns.org/dlang.org/web/phobos/std_signal.html) and 
implementation you're somewhat off.

Of course there are a few implementation issues.
- There is no WeakDelegate in druntime or phobos.

   Maybe requiring explicit disconnect is good enough?

- The lifetime of the delegate context could be scoped.

   No idea how to solve this one, but you could require that
   the delegate context is on the GC heap.

- When used this Signal definition requires boilerplate
   to restrict access to emit.

   This is unlucky but doesn't justify doubling the complexity
   of the module.

-Martin


More information about the Digitalmars-d mailing list