As a followup, Refinements are derivative of ClassBoxes which for several 
year's was an area of focus within Oscar Nierstrasz's  research group at the 
University of Bern. http://scg.unibe.ch/research/classboxes/ They started with 
Smalltalk and then went on to Java and C# implementations.  They have a 
considerable publication record on the subject 
http://scg.unibe.ch/scgbib?query=classbox 

The presentation deck that places Ruby Refnements into to context with 
classboxes is http://www.slideshare.net/ShugoMaeda/rc2010-refinements



On Mar 21, 2011, at 3:07 PM, Andrew Dupont wrote:

> Erik,
> 
> Yes, this is exactly what a framework like Prototype would need. Your code is 
> highly reminiscent of Ruby's proposed "refinements" feature [1], one which is 
> being debated for inclusion in Ruby 2.0. If this could be implemented in a 
> way that avoids the dreaded namespace dragons, then I would lobby hard for a 
> feature like this.
> 
> Cheers,
> Andrew
> 
> [1] http://timelessrepo.com/refinements-in-ruby
> 
> 
> On Mar 21, 2011, at 3:13 PM, Erik Arvidsson wrote:
> 
>> The thread about using private names is getting a bit unwieldy but I'd
>> like to focus on the  use case that I have been thinking of as
>> "Lexically scoped monkey patching" or "Lexically scoped object
>> extensions" instead of focusing on how to use "private names" to fit
>> this scenario.
>> 
>> Extending built ins and modifying existing classes to work around bugs
>> or to provide a better API is (or was) a common pattern. Today a lot
>> of JS library shun this approach due to the risk of conflicts.
>> 
>> Let us assume that you could extend an object in your current lexical
>> scope and that such extensions could be imported from a module into
>> your current scope.
>> 
>> Given:
>> 
>> {
>> function largerThanN(obj, n) {
>>   return obj.filter(function(item) {
>>     return item > n;
>>   }
>> }
>> 
>> var a = [0, 1, 2, 3, 4];
>> print(largerThanN(a, 2));
>> }
>> 
>> Now we would like to make largerThanN to work with Object objects. The
>> naïve thing to do is to just to add a filter method to
>> Object.prototype. However, this might cause conflicts with other code
>> that uses objects. The idea here is that we can do this safely in our
>> scope (ignore syntax except that it is important that it can be done
>> statically).
>> 
>> {
>> extend Object.prototype with {
>>   filter: function(fun) {
>>     var retval = {};
>>     for (var key in this) {
>>       if (fun(this[key])
>>         retval[key] = this[key];
>>     }
>>     return retval;
>>   }
>> };
>> 
>> function largerThanN(obj, n) {
>>   return obj.filter(function(item) {
>>     return item > n;
>>   }
>> }
>> 
>> var a = [0, 1, 2, 3, 4];
>> print(largerThanN(a, 2));
>> var o = {a: 0, b: 1, c: 2, d: 3, e: 4};
>> print(largerThanN(0, 2));
>> }
>> 
>> The above use case cannot be solved using private names because
>> private names conflict with public names.
>> 
>> Can we agree that this is a use case that we care about and focus on
>> this instead of whether private names can or cannot do this?
>> 
>> -- 
>> erik
>> _______________________________________________
>> es-discuss mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/es-discuss
> 
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to