Skip to content

Instantly share code, notes, and snippets.

@ayosec
Last active August 29, 2015 13:56
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ayosec/8794795 to your computer and use it in GitHub Desktop.
Save ayosec/8794795 to your computer and use it in GitHub Desktop.
Sweet.js: Better for

Add for(value <- items) and for(value, offset <- items) to Sweet.js

Examples

for(x <- [1,2,3,4]) {
  var a = x + 10;
  print(a);
}

for(x <- [1,2,3,4,5])
  print(x + 10);

for(x, i <- allItems())
  print(i, x)

for(i <- 1:10)
  print(i)

for(i <- a():b():5)
  print(i)
macro $for {
rule { ($value:ident, $index:ident, $items:expr) { $body... } } => {
var items = $items;
for(var $index = 0; $index < items.length; $index++) {
var $value = items[$index];
$body...
}
items = undefined;
}
}
macro $range {
rule { ($index:ident, $start:expr, $end:expr, $incr:expr) { $body... } } = {
var end = $end;
for(var i = $start; i < end; i += $incr) {
var $index = i;
$body...
}
}
}
let for = macro {
// for(value, index <- items)
rule { ($($value:ident, $index:ident <- $items:expr)) { $body... } } => { $for($value, $index, $items) { $body... } }
rule { ($value:ident, $index:ident <- $items:expr) $body:expr } => { $for($value, $index, $items) { $body } }
// for(value <- items)
rule { ($($value:ident <- $items:expr)) { $body... } } => { $for($value, i, $items) { $body... } }
rule { ($value:ident <- $items) $body:expr } => { $for($value, i, $items) { $body } }
// for(value <- start:end)
rule { ($index:ident <- $start:expr : $end:expr) { $body ... } } => { $range($index, $start, $end, 1) { $body... } }
rule { ($index:ident <- $start:expr : $end:expr) $body:expr } => { $range($index, $start, $end, 1) { $body } }
// for(value <- start:end:step)
rule { ($index:ident <- $start:expr : $end:expr : $step:expr) { $body ... } } => { $range($index, $start, $end, $step) { $body... } }
rule { ($index:ident <- $start:expr : $end:expr : $step:expr) $body:expr } => { $range($index, $start, $end, $step) { $body } }
// Default syntax
rule { ($a; $b; $c) $body:expr } => { for($a; $b; $c) $body }
rule { ($a in $c) $body:expr } => { for($a in $c) $body }
}
export foreach
// Tests
for(x <- [1,2,3,4]) {
var a = x + 10;
print(x);
}
for(x <- [1,2,3,4,5])
print(x + 10);
for(x in [1,2,3])
print(x);
for(x, i <- allItems())
print(i, x)
for(i <- 1:10)
print(i++)
for(i <- start():end()) {
var j = i * 10;
print(j)
}
for(i <- foo():bar():3) {
var j = i + 1;
print(j)
}
// Tests
var items$358 = [
1,
2,
3,
4
];
for (var i$359 = 0; i$359 < items$358.length; i$359++) {
var x$387 = items$358[i$359];
var a$388 = x$387 + 10;
print(x$387);
}
items$358 = undefined;
var items$362 = [
1,
2,
3,
4,
5
];
for (var i$363 = 0; i$363 < items$362.length; i$363++) {
var x$387 = items$362[i$363];
print(x$387 + 10);
}
items$362 = undefined;
;
for (x$387 in [
1,
2,
3
])
print(x$387);
var items$371 = allItems();
for (var i$372 = 0; i$372 < items$371.length; i$372++) {
var x$387 = items$371[i$372];
print(i$372, x$387);
}
items$371 = undefined;
var end$377 = 10;
for (var i$378 = 1; i$378 < end$377; i$378 += 1) {
var i$372 = i$378;
print(i$372++);
}
var end$381 = end();
for (var i$382 = start(); i$382 < end$381; i$382 += 1) {
var i$372 = i$382;
var j$389 = i$372 * 10;
print(j$389);
}
var end$385 = bar();
for (var i$386 = foo(); i$386 < end$385; i$386 += 3) {
var i$372 = i$386;
var j$389 = i$372 + 1;
print(j$389);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment