|
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) |
|
} |