<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Oct 13, 2010, at 5:14 PM, Brendan Eich wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>Now consider if you had a third parameter to the 'get' trap to signal callee context vs. non-callee context. You'd still want to proxy the functions, that doesn't get simpler just due to a change of trap parameters. You'd still want to cache for identity. But you would have made invoke-only methods.</div></div></div></blockquote><div><br></div>s/would/could/ in the last sentence -- the point is allowing get to tell when the property is being accessed as the callee in a call expression (or new expression? hmm) does not inevitably inject invoke only methods -- it simply adds the degree of freedom that someone could use to implement them.</div><div><br></div><div>Since there's no savings in terms of apples-to-apples method proxying and memoization ("caching") for ===, this degree of freedom seems strictly a misfeature. Even __noSuchMethod__ fans would agree!</div><div><br></div><div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Ok, let's give up on functional programming and cached methods. Here' s my version written to use only __noSuchMethod__, no proxies:</div><div><br></div><div><div><font class="Apple-style-span" face="'Courier New'">function makeLazyMethodCloner(eager) {</font></div><div><span class="Apple-style-span" style="font-family: 'Courier New'; ">&nbsp;&nbsp; &nbsp;return Object.create(Object.getPrototypeOf(eager), {</span></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;__noSuchMethod__: {</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;value: function (name, args) {</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return eager[name].apply(eager, arguments);</font></div></div></div></blockquote><div><br></div>s/arguments/args/</div><div><br></div><div>I was testing lightly. Again, the code posted here works in a current mozilla-central or tracemonkey js shell, or (with s/print/console.log/g) in Firefox 4 betas.</div><div><br></div><div>/be</div><br></body></html>