Как расширить Javascript с помощью новой инструкции - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь создать новый способ реализации циклов в Javascript.Пользователь наберет

Loop (n){// код для повторения}

и новая функция цикла будет повторять код внутри фигурных скобок 'n' раз.Это просто реализовало бы цикл while на заднем конце с переменной счетчика.

Я знаю, как создавать функции-прототипы, но мне нужно больше, чем просто передавать параметры в функцию.Я хочу, чтобы инструкция loop (n) повторяла блок кода, указанный кодером.

Я посмотрел на Sweet.js, но, похоже, нет никаких ссылок на то, что я делаюЯ предлагаю.

Как мне поступить?

1 Ответ

4 голосов
/ 01 апреля 2019

В документации 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;
}
...