如何使用新的 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...
}
我可能想指定用于计数器的标识符:
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;
}
我正在尝试创建一种在 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...
}
我可能想指定用于计数器的标识符:
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;
}