Пользовательские шаги предварительной обработки для coffeescript?

Есть ли способ добавить этапы предварительной обработки в компилятор кофе по модульному принципу?

Скажем, например, что я хотел расширить функциональность всех массивов и объектов с помощью функций подчеркивания, что позволило бы мне сделать что-то вроде testArray.first() и собрать его в _.first(testArray)

Это то, что было бы очень опасно делать в простом javascript, так как мне пришлось бы расширить Array.prototype и может нарушить функциональность массива в других библиотеках. Похоже, что с кофе-сценарием было бы безопасно и весело.

Было бы здорово, если бы был способ сделать это таким образом, что

  1. Модульный - я мог бы добавить несколько этапов предварительной обработки, извлекая из разных проектов, которые делают программирование более простым и элегантным по-разному
  2. Интегрирован - я хочу иметь возможность что-то изменить в конфигурационных файлах coffeescript, чтобы мне не приходилось использовать собственный двоичный файл и заменять команду в каждом отдельном инструменте разработки, который вызывает компилятор кофе (для компиляции в реальном времени и т. Д.),

Это существует в coffeescript? Если нет, то кажется, что так и должно быть. Я сообщу об этом разработчикам, если никто не слышал об этом.

1 ответ

Решение

У CoffeeScript нет системы плагинов. Там нет простого выхода, если вы хотите настроить его. Вы можете раскошелиться на репозиторий CoffeeScript и изменить компилятор в соответствии с вашими требованиями. Однако это означает, что вы должны поддерживать свой форк компилятора, регулярно извлекая обновления из основного репо.

Смотрите следующий код репозитория CoffeeScript ( https://github.com/jashkenas/coffeescript/blob/master/lib/coffee-script/coffee-script.js#L195):

....
  o[k] = v;
}
o.bare = true;
js = compile(code, o);
if (sandbox === global) {
  return vm.runInThisContext(js);
} else {
  return vm.runInContext(js, sandbox);
}
....

Вы можете добавить новый метод в этот файл

precompile = function (code) {
    // do pre-processing here
}

и сделать

js = compile(precompile(code), o);

Я не пытался сделать это, поэтому вы можете ударить по некоторым стенам, делая это. Хотя изменения, которые вы хотите, достаточно просты, чтобы не беспокоиться о лексере.

Хотя вы можете написать свой собственный анализатор для внесения этих изменений на любом языке и использовать grunt / gulp, чтобы объединить компиляцию кофе и шаг перед компиляцией. Я бы порекомендовал этот метод.

Другие вопросы по тегам