В документации Sweet.js действительно есть пример , который можно применить к циклу. Вот простая версия:
syntax loop = function (ctx) {
const count = ctx.next().value;
const code = ctx.next().value;
return #`for (let __n = 0; __n < ${count}; ++__n) ${code}`;
}
... хотя, возможно, есть лучший способ создать переменную цикла.
Вы бы использовали это так:
loop 10 {
// ...your code here...
}
Попробуйте здесь
Возможно, я бы хотел указать идентификатор для счетчика:
syntax loop = function (ctx) {
const count = ctx.next().value;
const identifier = ctx.next().value;
const code = ctx.next().value;
return #`for (let ${identifier} = 0; ${identifier} < ${count}; ++${identifier}) ${code}`;
}
Тогда:
loop 10 index {
console.log(index);
}
Попробуйте здесь
Полагаю, есть способ сделать идентификатор необязательным, если хотите.
Тем не менее, я бы просто использовал функцию, которой вы передаете обратный вызов:
function loop(end, callback) {
for (let n = 0; n < end; ++n) {
callback(n);
}
}
loop(10, n => console.log(n));
.as-console-wrapper {
max-height: 100% !important;
}
Вы можете сделать это более полнофункциональным довольно легко:
function loop(end, start, step, callback) {
if (typeof end !== "number") {
throw new Error("'end' should be a number");
}
if (typeof start === "function") {
callback = start;
start = 0;
step = 1;
} else if (typeof step === "function") {
callback = step;
step = 1;
}
if (typeof start !== "number") {
throw new Error("'start' should be a number");
}
if (typeof step !== "number") {
throw new Error("'step' should be a number");
}
for (let n = start; n < end; n += step) {
callback(n);
}
}
console.log("loop(3, n => console.log(n));");
loop(3, n => console.log(n));
console.log("loop(3, 1, n => console.log(n));");
loop(3, 1, n => console.log(n));
console.log("loop(6, 0, 2, n => console.log(n));");
loop(6, 0, 2, n => console.log(n));
.as-console-wrapper {
max-height: 100% !important;
}