[proxy] web.archive.org← back | site home | direct (HTTPS) ↗ | proxy home | ◑ dark◐ light
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also .

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also .
base repository: jashkenas/coffeescript
base: 0.2.4
head repository: jashkenas/coffeescript
compare: 0.2.5
  • 16 commits
  • 34 files changed
  • 0 comments
  • 1 contributor
Showing with 526 additions and 203 deletions.
  1. +2 −2 coffee-script.gemspec
  2. +6 −0 documentation/coffee/long_arrow.coffee
  3. +5 −4 documentation/coffee/switch.coffee
  4. +7 −4 documentation/coffee/while.coffee
  5. +33 −4 documentation/index.html.erb
  6. +3 −3 documentation/js/array_comprehensions.js
  7. +2 −1 documentation/js/expressions_comprehension.js
  8. +20 −0 documentation/js/long_arrow.js
  9. +2 −1 documentation/js/object_comprehensions.js
  10. +1 −1 documentation/js/overview.js
  11. +7 −5 documentation/js/switch.js
  12. +17 −6 documentation/js/while.js
  13. +24 −48 documentation/speed.html
  14. +3 −3 examples/documents.coffee
  15. +125 −33 index.html
  16. +1 −1 lib/coffee-script.rb
  17. +2 −2 lib/coffee_script/CoffeeScript.tmbundle/Syntaxes/CoffeeScript.tmLanguage
  18. +20 −8 lib/coffee_script/grammar.y
  19. +19 −16 lib/coffee_script/lexer.rb
  20. +94 −42 lib/coffee_script/nodes.rb
  21. +7 −1 lib/coffee_script/parse_error.rb
  22. +8 −1 lib/coffee_script/rewriter.rb
  23. +25 −0 lib/coffee_script/scope.rb
  24. +4 −0 lib/coffee_script/value.rb
  25. +1 −1 package.json
  26. +17 −1 test/fixtures/execution/test_destructuring_assignment.coffee
  27. +1 −1 test/fixtures/execution/test_everything.coffee
  28. +22 −0 test/fixtures/execution/test_functions.coffee
  29. +10 −1 test/fixtures/execution/test_heredocs.coffee
  30. +0 −8 test/fixtures/execution/test_named_functions.coffee
  31. +2 −0 test/fixtures/execution/test_splices.coffee
  32. +14 −0 test/fixtures/execution/test_switch.coffee
  33. +17 −0 test/fixtures/execution/test_while.coffee
  34. +5 −5 test/unit/test_lexer.rb
@@ -1,7 +1,7 @@
Gem::Specification.new do |s|
s.name = 'coffee-script'
s.version = '0.2.4' # Keep version in sync with coffee-script.rb
s.date = '2010-1-12'
s.version = '0.2.5' # Keep version in sync with coffee-script.rb
s.date = '2010-1-13'

s.homepage = "http://jashkenas.github.com/coffee-script/"
s.summary = "The CoffeeScript Compiler"
@@ -0,0 +1,6 @@
Account: customer, cart =>
this.customer: customer
this.cart: cart

$('.shopping_cart').bind('click') event ==>
this.customer.purchase(this.cart)
@@ -1,9 +1,10 @@
switch day
when "Tuesday" then eat_breakfast()
when "Wednesday" then go_to_the_park()
when "Saturday"
when "Mon" then go_to_work()
when "Tue" then go_to_the_park()
when "Thu" then go_ice_fishing()
when "Fri", "Sat"
if day is bingo_day
go_to_bingo()
go_dancing()
when "Sunday" then go_to_church()
when "Sun" then go_to_church()
else go_to_work()
@@ -1,5 +1,8 @@
while demand > supply
sell()
restock()
if this.studying_economics
while supply > demand then buy()
while supply < demand then sell()

while supply > demand then buy()
num: 6
lyrics: while num -= 1
num + " little monkeys, jumping on the bed.
One fell out and bumped his head."
@@ -51,7 +51,7 @@

<p>
<b>Latest Version:</b>
<a href="http://gemcutter.org/gems/coffee-script">0.2.4</a>
<a href="http://gemcutter.org/gems/coffee-script">0.2.5</a>
</p>

<h2>Table of Contents</h2>
@@ -76,6 +76,7 @@
<a href="#inheritance">Inheritance, and Calling Super from a Subclass</a><br />
<a href="#blocks">Blocks</a><br />
<a href="#pattern_matching">Pattern Matching</a><br />
<a href="#long_arrow">Function Binding</a><br />
<a href="#embedded">Embedded JavaScript</a><br />
<a href="#switch">Switch/When/Else</a><br />
<a href="#try">Try/Catch/Finally</a><br />
@@ -387,9 +388,12 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>

<p id="while">
<b class="header">While Loops</b>
The only low-level loop that CoffeeScript provides is the while loop.
The only low-level loop that CoffeeScript provides is the <b>while</b> loop. The
main difference from JavaScript is that the <b>while</b> loop can be used
as an expression, returning an array containing the result of each iteration
through the loop.
</p>
<%= code_for('while') %>
<%= code_for('while', 'lyrics.join("\n")') %>
<p>
Other JavaScript loops, such as <b>for</b> loops and <b>do-while</b> loops
can be mimicked by variations on <b>while</b>, but the hope is that you
@@ -528,6 +532,17 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
</p>
<%= code_for('object_extraction', 'poet + " — " + street') %>

<p id="long_arrow">
<b class="header">Function binding</b>
The long arrow <tt>==></tt> can be used to both define a function, and to bind
it to the current value of <tt>this</tt>, right on the spot. This is helpful
when using callback-based libraries like Prototype or jQuery, for creating
iterator functions to pass to <tt>each</tt>, or event-handler functions
to use with <tt>bind</tt>. Functions created with the long arrow are able to access
properties of the <tt>this</tt> where they're defined.
</p>
<%= code_for('long_arrow') %>

<p id="embedded">
<b class="header">Embedded JavaScript</b>
Hopefully, you'll never need to use it, but if you ever need to intersperse
@@ -546,6 +561,11 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
in a returnable, assignable expression. The format is: <tt>switch</tt> condition,
<tt>when</tt> clauses, <tt>else</tt> the default case.
</p>
<p>
As in Ruby, <b>switch</b> statements in CoffeeScript can take multiple
values for each <b>when</b> clause. If any of the values match, the clause
runs.
</p>
<%= code_for('switch') %>

<p id="try">
@@ -624,7 +644,16 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
</ul>

<h2 id="change_log">Change Log</h2>


<p>
<b class="header" style="margin-top: 20px;">0.2.5</b>
The conditions in switch statements can now take multiple values at once &mdash;
If any of them are true, the case will run. Added the long arrow <tt>==></tt>,
which defines and immediately binds a function to <tt>this</tt>. While loops can
now be used as expressions, in the same way that comprehensions can. Splats
can be used within pattern matches to soak up the rest of an array.
</p>

<p>
<b class="header" style="margin-top: 20px;">0.2.4</b>
Added ECMAScript Harmony style destructuring assignment, for dealing with
@@ -3,18 +3,18 @@
// Eat lunch.
lunch = (function() {
__a = []; __b = ['toast', 'cheese', 'wine'];
for (__c=0; __c<__b.length; __c++) {
for (__c = 0; __c < __b.length; __c++) {
food = __b[__c];
__a.push(eat(food));
}
return __a;
})();
// Naive collision detection.
__d = asteroids;
for (__e=0; __e<__d.length; __e++) {
for (__e = 0; __e < __d.length; __e++) {
roid = __d[__e];
__f = asteroids;
for (__g=0; __g<__f.length; __g++) {
for (__g = 0; __g < __f.length; __g++) {
roid2 = __f[__g];
if (roid !== roid2) {
if (roid.overlaps(roid2)) {
@@ -1,10 +1,11 @@
(function(){
var __a, __b, globals, name;
var __hasProp = Object.prototype.hasOwnProperty;
// The first ten global properties.
globals = ((function() {
__a = []; __b = window;
for (name in __b) {
if (__b.hasOwnProperty(name)) {
if (__hasProp.call(__b, name)) {
__a.push(name);
}
}
@@ -0,0 +1,20 @@
(function(){
var Account;
Account = function Account(customer, cart) {
var __a, __b;
var __this = this;
this.customer = customer;
this.cart = cart;
__a = $('.shopping_cart').bind('click', (function() {
__b = function(event) {
var __c;
__c = this.customer.purchase(this.cart);
return Account === this.constructor ? this : __c;
};
return (function() {
return __b.apply(__this, arguments);
});
})());
return Account === this.constructor ? this : __a;
};
})();
@@ -1,5 +1,6 @@
(function(){
var __a, __b, age, ages, child, years_old;
var __hasProp = Object.prototype.hasOwnProperty;
years_old = {
max: 10,
ida: 9,
@@ -9,7 +10,7 @@
__a = []; __b = years_old;
for (child in __b) {
age = __b[child];
if (__b.hasOwnProperty(child)) {
if (__hasProp.call(__b, child)) {
__a.push(child + " is " + age);
}
}
@@ -34,7 +34,7 @@
// Array comprehensions:
cubed_list = (function() {
__a = []; __b = list;
for (__c=0; __c<__b.length; __c++) {
for (__c = 0; __c < __b.length; __c++) {
num = __b[__c];
__a.push(math.cube(num));
}
@@ -1,14 +1,16 @@
(function(){
if (day === "Tuesday") {
eat_breakfast();
} else if (day === "Wednesday") {
if (day === "Mon") {
go_to_work();
} else if (day === "Tue") {
go_to_the_park();
} else if (day === "Saturday") {
} else if (day === "Thu") {
go_ice_fishing();
} else if (day === "Fri" || day === "Sat") {
if (day === bingo_day) {
go_to_bingo();
go_dancing();
}
} else if (day === "Sunday") {
} else if (day === "Sun") {
go_to_church();
} else {
go_to_work();
@@ -1,9 +1,20 @@
(function(){
while (demand > supply) {
sell();
restock();
}
while (supply > demand) {
buy();
var __a, lyrics, num;
if (this.studying_economics) {
while (supply > demand) {
buy();
}
while (supply < demand) {
sell();
}
}
num = 6;
lyrics = (function() {
__a = [];
while (num -= 1) {
__a.push(num + " little monkeys, jumping on the bed. \
One fell out and bumped his head.");
}
return __a;
})();
})();
@@ -14,63 +14,39 @@ <h1>Quickie CoffeeScript Speed Tests</h1>
var arr = [];
while (num--) arr.push(num);

JSLitmus.test('current comprehensions', function() {
__a = arr;
__c = [];
for (__b in __a) {
if (__a.hasOwnProperty(__b)) {
num = __a[__b];
__d = num;
__c.push(num);
}
}
});
var f1 = function f1() {
return arr;
};

JSLitmus.test('raw for loop (best we can do)', function() {
__a = arr;
__c = new Array(__a.length);
for (__b=0; __b < __a.length; __b++) {
__c[__b] = __a[__b];
}
JSLitmus.test('regular function', function() {
f1();
});

JSLitmus.test('current without hasOwnProperty check', function() {
__a = arr;
__c = [];
for (__b in __a) {
num = __a[__b];
__d = num;
__c.push(num);
}
});
var __this = this;

var f2 = function f2() {
return (function() {
return arr;
}).apply(__this, arguments);
};

JSLitmus.test('raw for..in loop', function() {
__a = arr;
__c = new Array(__a.length);
for (__b in __a) {
__c[__b] = __a[__b];
}
JSLitmus.test('bound function', function() {
f2();
});

JSLitmus.test('weepy\'s comprehensions', function() {
__c = []; __a = arr;
__d = function(num, __b) {
__c.push(num);
var f3 = (function() {
__b = function() {
return arr;
};
if (__a instanceof Array) {
for (__b=0; __b<__a.length; __b++) __d(__a[__b], __b);
} else {
for (__b in __a) { if (__a.hasOwnProperty(__b)) __d(__a[__b], __b); }
}
});
return (function f2() {
return __b.apply(__this, arguments);
});
})();

JSLitmus.test('CoffeeScript 0.2.2 comprehensions', function() {
__c = []; __a = arr;
for (__b=0; __b<__a.length; __b++) {
num = __a[__b];
__c.push(num);
}
JSLitmus.test('prebound function', function() {
f3();
});

</script>

</body>
@@ -15,8 +15,8 @@ dc.model.Document: dc.Model.extend({
# document by binding to Metadata, instead of on-the-fly.
metadata: =>
docId: this.id
_.select(Metadata.models(), (meta =>
_.any(meta.get('instances'), instance =>
_.select(Metadata.models(), (meta =>
_.any(meta.get('instances'), instance =>
instance.document_id is docId)))

bookmark: pageNumber =>
@@ -60,7 +60,7 @@ dc.model.DocumentSet: dc.model.RESTfulSet.extend({
# change their selected state.
_onModelEvent: e, model =>
this.base(e, model)
fire: e == dc.Model.CHANGED and model.hasChanged('selected')
fire: e is dc.Model.CHANGED and model.hasChanged('selected')
if fire then _.defer(_(this.fire).bind(this, this.SELECTION_CHANGED, this))

})

No commit comments for this range