How to escape implicit 'with (this)' of a method body

P T Withington ptw at pobox.com
Thu Jul 31 09:12:49 PDT 2008


On 2008-07-31, at 08:24EDT, Dave Herman wrote:

>> We should take this problem seriously. ...
>> Dynamic scope is very bad.
>
> Specifically:
>
> - Classes are supposed to provide integrity, but dynamic scope makes  
> the internals of code brittle; any variable reference inside the  
> implementation could be subverted by the seemingly innocuous  
> insertion of a property.
>
> - Dynamic dispatch has a reasonably understandable cost model, but  
> only if it's confined to explicit property references. With dynamic  
> scope, any variable reference could potentially be very expensive.
>
> - Generally, code within a `with' block is brittle and hard to  
> understand, and as Tucker says, the implicit `this.' means that all  
> code inside class methods is within a `with' block... this means  
> that all code inside class methods is brittle!
>
> - In the past, this has been enough for many programmers to  
> deprecate all use of `with' -- we should certainly hope to avoid the  
> same happening for classes.

CLOS (Lisp) has something very like 'reformed with' to let you write  
shorter method bodies without magic:

http://www.lispworks.com/documentation/HyperSpec/Body/m_w_slts.htm

Here's my take at an example of brittleness:

var bar = 42;

class foo {
   function zot () { return bar; }
}

...

class subfoo extends foo {
   var bar = 'oops!';
}

(new foo).zot() => 42
(new myfoo).zot() => ?





More information about the Es4-discuss mailing list