Le 03/04/2013 11:13, Marius Gundersen a écrit :
> "A core part of the problem here is that the distinction between an 'important' reference - one that must keep an object alive - and an 'incidental' reference, that only need exist as long as it target does"...

This is a concept which cannot be expressed in JavaScript today, but which most code actually needs to hint at in some way. Most objects are owned by one other object, and known by many other objects. The objects which knows of it shouldn't keep it alive, only the owner should. It is impossible to distinguish between these two cases in JavaScript today.
It is possible to make /a/ distinction with proxies. More specifically, with revocable proxies [1]

    let { proxy, revoke } = Proxy.revocable(target, handler);
    proxy.foo // traps
    revoke()
    proxy.foo // throws TypeError: "proxy is revoked"

Let's create a small abstraction on top of that:

    function RevocableRef(target){
        var transparentHandler = {};
        return Proxy.revocable(target, transparentHandler);
    }

You can keep the original target and the revoke function to yourself and decide only to share RevocableRefs of the object (which is pretty much the equivalent of wrapping with the WeakRef constructor). When you don't want others to access the object anymore, just call the revoke function.

It is one way to make a distinction between different references to the same object and keep control of who has access to which object at what time.

An example of this would be a GUI with event listening widgets, which is usually a tree where each widget is owned by its parent, and a widget without a parent should stop listening to events. There are many ways to implement this without WeakRefs, usually involving an explicit _parent_ field and a dispose method when a widget is removed. But with WeakRefs this could be implemented so only the parent has a strong reference to the children, everyone else has weak references and so the widget (and all its children) are garbage collected and stop listening to events when the parent deletes it.
In that case, it seems that only the parent would keep a strong reference to a child widget and hand over a RevocableRef to other parties. When detaching the child widget, the parent would just need to call the revoke function. I admit this is more work than just detaching the child, but it is not a huge amount (calling one function). More interestingly, all the control of references remains at the parent level, that is, the parent decides which type of reference is shared (a revocable one or not); no need for third-parties to comply to a "dispose protocol", where different parties have to dispose, sometimes recursively which can be a mess.

The idea of being able to differentiate references is interesting, but doesn't seem to justify the non-determinism that comes with WeakRefs. It sounds that what we already have (revokable proxies and the RevocableRef abstraction above) would be enough in the use case you described (and Kevin's use case too from what I understand). If I misunderstood any of your (Kevin and Marius) use cases, could you explain what would be the added value of WeakRefs over revokable proxies.

Do languages which added WeakRefs have a form of revokable reference too? What difference would it make?

David

[1] http://wiki.ecmascript.org/doku.php?id=strawman:revokable_proxies
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to