如何使用新的 while 语句扩展 Javascript

How to extend Javascript with new while statment

我正在尝试创建一种在 Javascript 中实现循环的新方法。用户将输入

Loop(n)
{
// code to repeat
}

并且新的循环函数会重复大括号内的代码 'n' 次。它会简单地在后端用一个计数器变量实现一个 while 循环。

我知道如何创建原型函数,但我需要的不仅仅是将参数传递给函数。我希望 loop(n) 语句重复编码器指定的代码块。

我已经看过 Sweet.js,但似乎没有任何关于执行我所提议的内容的参考。

我该怎么做?

Sweet.js 文档确实有 an example 可以应用于循环。这是一个简单的版本:

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

Try it out 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);
}

Try it out here

如果您愿意,我希望有一种方法可以使标识符可选。


就是说,我只是使用一个你将回调传递给的函数:

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