В статията на bluebird wiki за убийците на JavaScript оптимизация, авторът споменава, че предаването на ключовата дума arguments
към която и да е функция (с изключение на apply
) ще накара родителската функция да не бъде оптимизирана. Бих искал да създам sweet.js макрос, който ми позволява да пиша стандартен идиоматичен JavaScript, но ще се погрижи за убиеца на оптимизацията .
В идеалния случай бих искал макрос, който да изпълнява следната функция:
function foo() {
var args = [].slice.call(arguments);
return args;
}
И извежда нещо като това:
function foo() {
var args = [];
for(var i, len = arguments.length; i < len; i++) {
args.push(arguments[i]);
}
return args;
}
Имам обаче проблеми с правилния синтаксис на макроса sweet.js. Ето какво имам досега:
пример.sjs
let arguments = macro {
rule infix {
[].slice.call |
} => {
[];
for(var i = 0, len = arguments.length; i < len; i++) {
args.push(arguments[i])
}
}
}
function toArray() {
var args = [].slice.call arguments
return args;
}
Което извежда следното:
function toArray() {
var args$2 = [];
for (var i = 0, len = arguments.length; i < len; i++) {
args.push(arguments[i]);
}
return args$2;
}
Опитах се да накарам моя макрос да има скоби около ключовата дума arguments
и също да включа декларацията var
, но без никакъв успех. Опитах нещо подобно:
невалиден макрос
let arguments = macro {
rule infix {
var $var = [].slice.call ( | )
} => {
var $var = [];
for(var i = 0, len = arguments.length; i < len; i++) {
args.push(arguments[i])
}
}
}
Това води до следната грешка:
SyntaxError: [syntaxCase] Infix macros require a `|` separator
414:
^
arguments
къмArray.prototype.slice.call
. - person kzh   schedule 25.10.2014