On 12/4/13 2:48 PM, Brendan Eich wrote:
Peter Thiemann wrote:
1. Contracts implemented using proxies. Adding a contract to a program should never change the semantics of contract-abiding code - if the contract is violated, it is of course fine to crash.

Meaning throw an exception, which could be caught? That seems like it could require a program change.

Ideally, it should be an exception that cannot be caught by the code under contract. AFAIK, current implementations rely on user exceptions. I don't know what Racket does.


Also, adding a contract to a program should not force you to change something else in your program: a very useful pattern is to impose a contract on code loaded at run time, say, a mashup. In this case, it is very cumbersome to patch up this code to use a different equalp (intercept the load, parse everything, rewrite the parse tree, etc) and it has to be done for eval, too.

Mashups seem content with identity-preserving membranes, but I defer to Mark.

2. Monitoring implemented using proxies. Here, you'd use the proxy to record all gets and sets applied to an object, for example, to create a replayable mock object. Again, adding monitoring should not change the meaning of the program and you should not be forced to change the code.

I would think such monitoring wrappers (I've written them) want only the mock and never the object it wraps to escape to code that tests o === o. Identity-preserving membrane, with the monitored object only on one side, the mock only on the other.

That sounds fine if you apply the wrapper globally, but what if you apply it locally in the scope of an interesting function? In that case, there is no clear boundary of what's left or right of the membrane, so that the wrapped object could be compared with its unwrapped target.

-Peter

_______________________________________________
dev-tech-js-engine-internals mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals

Reply via email to