implement array comprehension

This commit is contained in:
Sebastian McKenzie
2014-09-29 15:35:03 +10:00
parent b0cfbb20ca
commit 74a661bf44
14 changed files with 112 additions and 2 deletions

View File

@@ -45,9 +45,9 @@
| [Computed property names](FEATURES.md#computed-property-names) | ✓ | |
| [Constants](FEATURES.md#constants) | ✓ | |
| [Binary and Octal Literals](FEATURES.md#binary-and-octal-literals) | ✓ | |
| [Iterators](FEATURES.md#iterators) | | ✓ |
| [Iterators](FEATURES.md#iterators) | | ✓ |
| [Array comprehension](FEATURES.md#array-comprehension) | ✓ | |
| [Destructuring assignment](FEATURES.md#destructuring-assignment) | | |
| [Array comprehension](FEATURES.md#array-comprehension) | | |
| [Generators](FEATURES.md#generators) | | |
## Installation
@@ -157,6 +157,10 @@ browserify()
Cannot subclass built-ins such as `Date`, `Array`, `DOM` etc.
### Generator comprehension
Not supported.
## Comparison to Traceur
### Performance

View File

@@ -0,0 +1,5 @@
(function () {
var KEY = [];
return KEY;
})();

View File

@@ -0,0 +1,3 @@
OBJECT.forEach(function (KEY) {
});

View File

@@ -0,0 +1 @@
KEY.push(STATEMENT);

3
lib/6to5/templates/if.js Normal file
View File

@@ -0,0 +1,3 @@
if (STATEMENT) {
}

View File

@@ -0,0 +1,55 @@
var util = require("../util");
exports.ComprehensionExpression = function (node, parent, opts, generateUid) {
var uid = generateUid("arr");
var container = util.template("array-comprehension-container", {
KEY: uid
});
var block = container.callee.body;
var body = block.body;
var returnStatement = body.pop();
var build = function () {
var self = node.blocks.shift();
if (!self) return;
if (!self.of) {
throw util.errorWithNode(self, "for-in array comprehension is not supported");
}
var child = build();
if (!child) {
// last item
child = util.template("array-push", {
KEY: uid,
STATEMENT: node.body
}, true);
if (node.filter) {
var filter = util.template("if", {
STATEMENT: node.filter
});
filter.consequent.body = [child];
child = filter;
}
}
var container2 = util.template("array-comprehension-for-each", {
OBJECT: self.right,
KEY: self.left,
}, true);
container2.expression.arguments[0].body.body = [child];
return container2;
};
body.push(build());
body.push(returnStatement);
return container;
};

View File

@@ -0,0 +1 @@
var seattlers = [for (c of customers) if (c.city == "Seattle") { name: c.name, age: c.age }];

View File

@@ -0,0 +1,12 @@
var seattlers = function () {
var _arr = [];
customers.forEach(function (c) {
if (c.city == "Seattle") {
_arr.push({
name: c.name,
age: c.age
});
}
});
return _arr;
}();

View File

@@ -0,0 +1 @@
var arr = [for (x of "abcdefgh".split("")) for (y of "12345678".split("")) (x + y)];

View File

@@ -0,0 +1,11 @@
var arr = (function () {
var _arr = [];
"abcdefgh".split("").forEach(function (x) {
"12345678".split("").forEach(function (y) {
_arr.push(x + y);
});
});
return _arr;
})();

View File

@@ -0,0 +1 @@
var arr = [for (i in [1, 2, 3]) i * i];

View File

@@ -0,0 +1,3 @@
{
"throws": "for-in array comprehension is not supported"
}

View File

@@ -0,0 +1 @@
var arr = [for (i of [1, 2, 3]) i * i];

View File

@@ -0,0 +1,9 @@
var arr = (function () {
var _arr = [];
[1, 2, 3].forEach(function (i) {
_arr.push(i * i);
});
return _arr;
})();