<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tender Lovemaking &#187; ecma</title>
	<atom:link href="http://tenderlovemaking.com/category/ecma/feed/" rel="self" type="application/rss+xml" />
	<link>http://tenderlovemaking.com</link>
	<description>The act of making love, tenderly.</description>
	<lastBuildDate>Thu, 16 Feb 2012 17:10:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Take it to the limit one more time</title>
		<link>http://tenderlovemaking.com/2008/04/23/take-it-to-the-limit-one-more-time/</link>
		<comments>http://tenderlovemaking.com/2008/04/23/take-it-to-the-limit-one-more-time/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 18:22:29 +0000</pubDate>
		<dc:creator>Aaron Patterson</dc:creator>
				<category><![CDATA[computadora]]></category>
		<category><![CDATA[ecma]]></category>
		<category><![CDATA[johnson]]></category>
		<category><![CDATA[rkelly]]></category>

		<guid isPermaLink="false">http://tenderlovemaking.com/?p=138</guid>
		<description><![CDATA[Sup bros. I need to post in this thing more often. Yesterday, someone tipped over my scooter again. I&#8217;m getting kind of tired of that. Anyway, its time for me to write about this. RKelly is &#8230; <a class="more-link" href="http://tenderlovemaking.com/2008/04/23/take-it-to-the-limit-one-more-time/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sup bros.  I need to post in this thing more often.  Yesterday, someone tipped over <a href="http://flickr.com/photos/aaronp/150189237/">my scooter</a> again.  I&#8217;m getting kind of tired of that.</p>
<p>Anyway, its time for me to write about this.  <a href="http://rubyforge.org/projects/rkelly/">RKelly</a> is pretty much dead.  For the past few months, <a href="http://geeksomnia.com/">John</a> and I have been working on RKelly&#8217;s replacement called <a href="http://github.com/jbarnette/johnson/tree/master">Johnson</a>.  Basically we&#8217;re now putting a ruby wrapper around <a href="http://www.mozilla.org/js/spidermonkey/">Mozilla&#8217;s Spidermonkey</a>.  The project is coming along quite nicely.  Ruby objects can be passed in to javascript land, and javascript objects can be passed back in to ruby land.</p>
<p>For example, we can define an alert function in our javascript context:</p>
<pre class="brush: ruby; title: ; notranslate">
require 'johnson'

ctx = Johnson::Context.new
ctx['alert'] = lambda { |x| puts x }
ctx.evaluate('alert(&quot;Hello world!&quot;);')
</pre>
<p>Johnson::Context#evaluate will also return the last statement evaluated.  We can evaluate an expression, and manipulate that expression in ruby land.  For example, I&#8217;ll create an object in javascript, return it to ruby land, then access a property of the javascript object:</p>
<pre class="brush: ruby; title: ; notranslate">
require 'johnson'

ctx = Johnson::Context.new
obj = ctx.evaluate('var foo = { x: &quot;hello world&quot; }; foo')
puts obj.x  # =&gt; 'hello world'
</pre>
<p>We can even do the reverse by stuffing ruby objects in to the context:</p>
<pre class="brush: ruby; title: ; notranslate">
A = Struct.new(:foo)

ctx = Johnson::Context.new
ctx['alert'] = lambda { |x| puts x }
ctx['a'] = A.new(&quot;bar&quot;)
ctx.evaluate('alert(a.foo);') # =&gt; 'bar'
</pre>
<p>But it gets better.  We added a top level variable called &#8220;Ruby&#8221; that lets you access constants and globals from Ruby land.  We can rewrite the previous example completely in javascript:</p>
<pre class="brush: ruby; title: ; notranslate">
ctx = Johnson::Context.new
ctx.evaluate(&quot;var x = new (new Ruby.Struct(Johnson.symbolize('foo')));&quot;)
ctx.evaluate(&quot;x.foo = 'bar'&quot;)
puts ctx.evaluate('x').foo # =&gt; 'bar'
puts ctx.evaluate('x').class # =&gt; #&lt;Class:0x49714&gt;
</pre>
<p>Since the &#8216;Ruby&#8217; constant delegates to Object, you can access any constant.  Including ones you&#8217;ve defined yourself.  We could, for example, look up a bunch of User records through rails:</p>
<pre class="brush: ruby; title: ; notranslate">
ctx = Johnson::Context.new
ctx['alert'] = lambda { |x| puts x }
ctx.evaluate(&lt;&lt;-END
             for(var user in Ruby.User.find(Johnson.symbolize('all'))) {
               alert(user.first_name());
             }
             END
            )
</pre>
<p>You might be wondering what this Johnson.symbolize business is about.  Since Javascript doesn&#8217;t have a concept of a symbol, we&#8217;ve created a helper to &#8220;mark&#8221; a string as a symbol and pass it back in to ruby land.</p>
<p>To conclude this update about my Johnson, I&#8217;d like to show off an interactive shell for Johnson (thanks to <a href="http://www.yehudakatz.com/">Brohuda Katz</a>).  Johnson has an interactive shell that lets you try things out in javascript land or ruby land, and let you quickly switch between the two.  Typing &#8216;js&#8217; will put in you the javascript shell, &#8216;rb&#8217; will switch you to the ruby shell.  In the ruby shell, you can use the &#8216;cx&#8217; variable to get ahold of you javascript context:<br />
<code><br />
$ ruby -I lib bin/johnson<br />
js> var x = { foo: 'bar', hello: function() { return 'world' } };<br />
=> nil<br />
js> rb<br />
rb> cx['x'].foo<br />
=> "bar"<br />
rb> cx['x'].hello()<br />
=> "world"<br />
rb><br />
[/sourcecode]<br />
We aren't quite ready for a release yet, but if you'd like to play around with Johnson, you can pull it down from github <a href="http://github.com/jbarnette/johnson/tree/master">here</a>.  Just run 'rake', and you should have it compiled and running!</p>
<p>My next Johnson related post will be about Javascript parse trees and Javascript code generation.</p>
]]></content:encoded>
			<wfw:commentRss>http://tenderlovemaking.com/2008/04/23/take-it-to-the-limit-one-more-time/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Pointcut Your Javascript</title>
		<link>http://tenderlovemaking.com/2008/01/24/pointcut-your-javascript/</link>
		<comments>http://tenderlovemaking.com/2008/01/24/pointcut-your-javascript/#comments</comments>
		<pubDate>Fri, 25 Jan 2008 06:29:03 +0000</pubDate>
		<dc:creator>Aaron Patterson</dc:creator>
				<category><![CDATA[ecma]]></category>
		<category><![CDATA[rkelly]]></category>
		<category><![CDATA[aop]]></category>
		<category><![CDATA[ast]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[modify ast]]></category>

		<guid isPermaLink="false">http://tenderlovemaking.com/2008/01/24/pointcut-your-javascript/</guid>
		<description><![CDATA[Sorry for all of the RKelly updates, but thats what I&#8217;ve been doing in my free time. I mean, besides J-School. But I don&#8217;t think anyone wants to read my poor Japanese! I wanted to make &#8230; <a class="more-link" href="http://tenderlovemaking.com/2008/01/24/pointcut-your-javascript/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sorry for all of the RKelly updates, but thats what I&#8217;ve been doing in my free time.  I mean, besides J-School.  But I don&#8217;t think anyone wants to read my poor Japanese!</p>
<p>I wanted to make my ASTs easily searchable, so I added an AOP style interface to my AST.  The AST will now let you <a href="http://en.wikipedia.org/wiki/Pointcut">pointcut</a> your javascript and give you back a list of all of the points it finds.  Take this javascript for example:</p>
<pre class="brush: jscript; title: ; notranslate">
try {
  Element.update('another_id',&quot;blah blah blah&quot;);
  Element.update(10,&quot;blah blah blah&quot;);
} catch (e) { }
</pre>
<p>Lets say you wanted to find every place that Element.update() was called with 2 arguments, and mess with those arguments.  You can pointcut the ast, then modify the arguments by giving the AST a pattern to match on like so:</p>
<pre class="brush: ruby; title: ; notranslate">
parser = RKelly::Parser.new
ast = parser.parse(DATA.read)
ast.pointcut(&quot;Element.update(Object, Object)&quot;).matches.each do |m|
  m.arguments.value.each { |x|
    x.value = rand(20)
  }
end

puts ast.to_ecma
</pre>
<p>But lets say you only want to update the call that was made with a number as the first parameter.  No problem!  Just change your pattern to use a number, like so:</p>
<pre class="brush: ruby; title: ; notranslate">
parser = RKelly::Parser.new
ast = parser.parse(DATA.read)
ast.pointcut(&quot;Element.update(Number, Object)&quot;).matches.each do |m|
  m.arguments.value.each { |x|
    x.value = rand(20)
  }
end

puts ast.to_ecma
</pre>
<p>You can even get more specific and match the arguments exactly.  For example, matching just the function call where the first argument is &#8216;another_id&#8217;:</p>
<pre class="brush: ruby; title: ; notranslate">
parser = RKelly::Parser.new
ast = parser.parse(DATA.read)
ast.pointcut(&quot;Element.update('another_id', Object)&quot;).matches.each do |m|
  m.arguments.value.each { |x|
    x.value = rand(20)
  }
end
</pre>
<p>Maybe you don&#8217;t care the update is being called on an Element, but you want to match all places that update is being called on <em>something</em>.  The pointcut will match on node type too, so this is a perfectly valid pattern:</p>
<pre class="brush: ruby; title: ; notranslate">
parser = RKelly::Parser.new
ast = parser.parse(DATA.read)
ast.pointcut(&quot;ResolveNode.update('another_id', Object)&quot;).matches.each do |m|
  m.arguments.value.each { |x|
    x.value = rand(20)
  }
end
</pre>
<p>Hopefully you get the picture.  This feature isn&#8217;t full tested yet, but I think I might do my first RKelly release after I finish testing.</p>
]]></content:encoded>
			<wfw:commentRss>http://tenderlovemaking.com/2008/01/24/pointcut-your-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Clean it up!  RKelly::Nodes::Node#to_ecma</title>
		<link>http://tenderlovemaking.com/2008/01/23/clean-it-up-rkellynodesnodeto_ecma/</link>
		<comments>http://tenderlovemaking.com/2008/01/23/clean-it-up-rkellynodesnodeto_ecma/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 17:18:13 +0000</pubDate>
		<dc:creator>Aaron Patterson</dc:creator>
				<category><![CDATA[ecma]]></category>
		<category><![CDATA[rkelly]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://tenderlovemaking.com/2008/01/23/clean-it-up-rkellynodesnodeto_ecma/</guid>
		<description><![CDATA[Last night at Nerd Club, I decided to add a &#8220;to_ecma&#8221; method to]]></description>
			<content:encoded><![CDATA[<p>Last night at Nerd Club, I decided to add a &#8220;to_ecma&#8221; method to <a href="http://rubyforge.org/projects/rkelly/"">RKelly</a>.  This means you can turn your ECMA AST back in to ECMAScript, with the added bonus of properly indenting your code.  For example:</p>
<pre class="brush: ruby; title: ; notranslate">
require 'rkelly'

parser = RKelly::Parser.new
puts parser.parse(DATA.read).to_ecma

__END__
function yo(a,b,a) { this.be.some(); if(nasty) { code();} }
</pre>
<p>will output this:</p>
<pre class="brush: jscript; title: ; notranslate">
function yo(a, b, a){
  this.be.some();
  if(nasty) {
    code();
  }
}
</pre>
<p>Now you should be able to modify your AST and generate javascript.  Next I want to add finders to easily find nodes in the tree.</p>
]]></content:encoded>
			<wfw:commentRss>http://tenderlovemaking.com/2008/01/23/clean-it-up-rkellynodesnodeto_ecma/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>パンツないな興奮 &#8211; Javascript stuff</title>
		<link>http://tenderlovemaking.com/2008/01/19/%e3%83%91%e3%83%b3%e3%83%84%e3%81%aa%e3%81%84%e3%81%aa%e8%88%88%e5%a5%ae-javascript-stuff/</link>
		<comments>http://tenderlovemaking.com/2008/01/19/%e3%83%91%e3%83%b3%e3%83%84%e3%81%aa%e3%81%84%e3%81%aa%e8%88%88%e5%a5%ae-javascript-stuff/#comments</comments>
		<pubDate>Sat, 19 Jan 2008 20:11:03 +0000</pubDate>
		<dc:creator>Aaron Patterson</dc:creator>
				<category><![CDATA[ecma]]></category>
		<category><![CDATA[rkelly]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[weird stuff]]></category>

		<guid isPermaLink="false">http://tenderlovemaking.com/2008/01/19/%e3%83%91%e3%83%b3%e3%83%84%e3%81%aa%e3%81%84%e3%81%aa%e8%88%88%e5%a5%ae-javascript-stuff/</guid>
		<description><![CDATA[While writing RKelly (a pure ruby javascript interpreter), I&#8217;ve run across weird cases in the ECMA spec that I didn&#8217;t know about before. For example, when coercing an object into a number, first the &#8220;valueOf&#8221; property &#8230; <a class="more-link" href="http://tenderlovemaking.com/2008/01/19/%e3%83%91%e3%83%b3%e3%83%84%e3%81%aa%e3%81%84%e3%81%aa%e8%88%88%e5%a5%ae-javascript-stuff/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>While writing <a href="http://rubyforge.org/projects/rkelly">RKelly</a> (a pure ruby javascript interpreter), I&#8217;ve run across weird cases in the ECMA spec that I didn&#8217;t know about before.  For example, when coercing an object into a number, first the &#8220;valueOf&#8221; property is checked.  That seemed to make sense to me.  But then the spec says that if there is no &#8220;valueOf&#8221; property, to check the &#8220;toString&#8221; property and try to coerce that in to a number.</p>
<p>So, this bit of code:</p>
<pre class="brush: jscript; title: ; notranslate">
var x = new Object;
x.valueOf = function() { return 11; };
x++;
</pre>
<p>is equivalent to this bit of code:</p>
<pre class="brush: jscript; title: ; notranslate">
var x = new Object;
x.stringValue = function() { return &quot;11&quot;; }
x++;
</pre>
<p>That is some underpants-free excitement.</p>
]]></content:encoded>
			<wfw:commentRss>http://tenderlovemaking.com/2008/01/19/%e3%83%91%e3%83%b3%e3%83%84%e3%81%aa%e3%81%84%e3%81%aa%e8%88%88%e5%a5%ae-javascript-stuff/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Happy New Year! (RKelly Progress report)</title>
		<link>http://tenderlovemaking.com/2008/01/03/happy-new-year-rkelly-progress-report/</link>
		<comments>http://tenderlovemaking.com/2008/01/03/happy-new-year-rkelly-progress-report/#comments</comments>
		<pubDate>Thu, 03 Jan 2008 18:31:52 +0000</pubDate>
		<dc:creator>Aaron Patterson</dc:creator>
				<category><![CDATA[computadora]]></category>
		<category><![CDATA[ecma]]></category>
		<category><![CDATA[mechanize]]></category>
		<category><![CDATA[rkelly]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://tenderlovemaking.com/2008/01/03/happy-new-year-rkelly-progress-report/</guid>
		<description><![CDATA[I&#8217;ve just started getting the runtime working with RKelly. Its working well enough at this point that I was able to execute my earlier Fibonacci example. I&#8217;ve added a method to the runtime that allows you &#8230; <a class="more-link" href="http://tenderlovemaking.com/2008/01/03/happy-new-year-rkelly-progress-report/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just started getting the runtime working with RKelly.  Its working well enough at this point that I was able to execute my earlier Fibonacci example.  I&#8217;ve added a method to the runtime that allows you to define ruby functions that may be called from inside javascript.  For example, the alert function in the following example is defined in ruby and delegates to puts.</p>
<pre class="brush: ruby; title: ; notranslate">
runtime = RKelly::Runtime.new

runtime.define_function(:alert) do |*args|
  puts(*args)
end

runtime.execute(&lt;&lt;END
function f(n) {
  var s = 0;
  if(n == 0) return(s);
  if(n == 1) {
    s += 1;
    return(s);
  } else {
    return(f(n - 1) + f(n - 2));
  }
}
alert(f(20));
END
)
</pre>
<p>Here is the execution time with ruby 1.8.6 on my machine:<br />
<code><br />
[aaron@mac-mini rkelly]$ time ~/.multiruby/install/1.8.6-p111/bin/ruby -I lib test.rb<br />
6765</p>
<p>real	0m54.332s<br />
user	0m53.913s<br />
sys	0m0.336s<br />
[aaron@mac-mini rkelly]$<br />
[/sourcecode]</p>
<p>Same code, same machine, but with ruby 1.9.0:</p>
<p><code><br />
[aaron@mac-mini rkelly]$ time ~/.multiruby/install/1.9.0-0/bin/ruby -I lib test.rb<br />
6765</p>
<p>real	0m20.863s<br />
user	0m20.678s<br />
sys	0m0.142s<br />
[aaron@mac-mini rkelly]$<br />
[/sourcecode]</p>
<p>I need to get loops working next!</p>
]]></content:encoded>
			<wfw:commentRss>http://tenderlovemaking.com/2008/01/03/happy-new-year-rkelly-progress-report/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Parsing Javascript Parser</title>
		<link>http://tenderlovemaking.com/2007/12/24/parsing-javascript-parser/</link>
		<comments>http://tenderlovemaking.com/2007/12/24/parsing-javascript-parser/#comments</comments>
		<pubDate>Mon, 24 Dec 2007 19:41:46 +0000</pubDate>
		<dc:creator>Aaron Patterson</dc:creator>
				<category><![CDATA[ecma]]></category>

		<guid isPermaLink="false">http://tenderlovemaking.com/2007/12/24/parsing-javascript-parser/</guid>
		<description><![CDATA[I&#8217;ve been working hard on RKelly lately. RKelly is a ruby implementation of Kelly. Kelly is a fictional project that I made up so that I could name my project RKelly. Anyway, RKelly is a javascript &#8230; <a class="more-link" href="http://tenderlovemaking.com/2007/12/24/parsing-javascript-parser/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working hard on <a href="http://rubyforge.org/projects/rkelly">RKelly</a> lately.  RKelly is a ruby implementation of Kelly.  Kelly is a fictional project that I made up so that I could name my project RKelly.  Anyway, RKelly is a javascript parser, and will be an interpreter someday.  Today I was able to get RKelly to parse and produce a parse tree of <a href="http://www.prototypejs.org/">prototype.js</a>.  I couldn&#8217;t get GraphViz to export the file, but you can download the dot file <a href="http://tenderlovemaking.com/wp-content/uploads/2007/12/prototype.dot">here</a>.</p>
<p>Here is a parse tree of a function that calculates the fibonacci sequence:<br />
<a href="http://www.flickr.com/photos/aaronp/2134057660/" title="fibonacci parse tree by fakebeard, on Flickr"><img src="http://farm3.static.flickr.com/2419/2134057660_49773b6da9.jpg" width="500" height="294" alt="fibonacci parse tree" /></a></p>
<p>Here is the javascript code:</p>
<pre class="brush: jscript; title: ; notranslate">
function f(n) {
  var s = 0;
  if(n == 0) return(s);
  if(n == 1) {
    s += 1;
    return(s);
  } else {
    return(f(n - 1) + f(n - 2));
  }
}
</pre>
<p>And the ruby code that produced that graph:</p>
<pre class="brush: ruby; title: ; notranslate">
require 'rkelly'

parser = RKelly::Parser.new
puts parser.parse(File.read(ARGV[0])).to_dots
</pre>
<p>I need a new computer&#8230;..  It took 2 minutes to render the prototype graph!  Ugh!</p>
]]></content:encoded>
			<wfw:commentRss>http://tenderlovemaking.com/2007/12/24/parsing-javascript-parser/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>More ECMA Awesomeness</title>
		<link>http://tenderlovemaking.com/2007/05/22/more-ecma-awesomeness/</link>
		<comments>http://tenderlovemaking.com/2007/05/22/more-ecma-awesomeness/#comments</comments>
		<pubDate>Tue, 22 May 2007 15:47:54 +0000</pubDate>
		<dc:creator>Aaron Patterson</dc:creator>
				<category><![CDATA[computadora]]></category>
		<category><![CDATA[ecma]]></category>
		<category><![CDATA[rkelly]]></category>

		<guid isPermaLink="false">http://tenderlovemaking.com/2007/05/22/more-ecma-awesomeness/</guid>
		<description><![CDATA[I&#8217;ve been adding more tender loving javascript features to RKelly (my Javascript to Ruby converter). You can now call to_ruby on an RKelly object and get back your Javascript as Ruby. For example: And that will &#8230; <a class="more-link" href="http://tenderlovemaking.com/2007/05/22/more-ecma-awesomeness/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been adding more tender loving javascript features to <a href="http://rubyforge.org/projects/rkelly/">RKelly</a> (my Javascript to Ruby converter).  You can now call to_ruby on an RKelly object and get back your Javascript as Ruby.  For example:</p>
<pre class="brush: ruby; title: ; notranslate">
puts RKelly.process(&lt;&lt;END
function c() {
  alert('asdfasdf');
}
var a = {};
foo['b'] = c;
END
).to_ruby
</pre>
<p>And that will out put the following ruby code:</p>
<pre class="brush: ruby; title: ; notranslate">
def c
  alert(&quot;asdfasdf&quot;)
end
a = lambda do
  s = OpenStruct.new
  return s
end.call
class &lt;&lt; foo
  def b
    alert(&quot;asdfasdf&quot;)
  end
end
</pre>
<p>Implicit object declaration is now supported too:</p>
<pre class="brush: ruby; title: ; notranslate">
puts RKelly.process(&lt;&lt;END
var s = {
  x: function () { alert(&quot;blh&quot;); },
  y: &quot;foo&quot;
};
END
).to_ruby
</pre>
<p>Which will output this:</p>
<pre class="brush: ruby; title: ; notranslate">
s = lambda do
  s = OpenStruct.new
  class &lt;&lt; s
    def x
      alert(&quot;blh&quot;)
    end
  end
  s[&quot;y&quot;] = &quot;foo&quot;
  return s
end.call
</pre>
<p>One thing I&#8217;ve found while implementing RKelly is that javascript tends to pass around function pointers a lot.  I will probably have to convert RKelly to declare lambdas for all functions instead of actual functions.  The problem is that I&#8217;ll need to get it so the lambdas will be executed in the context of the object, but I&#8217;m sure that will be pretty easy.</p>
]]></content:encoded>
			<wfw:commentRss>http://tenderlovemaking.com/2007/05/22/more-ecma-awesomeness/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

