Я работаю над библиотекой комбинатора синтаксического анализа в JavaScript.Для этого я хочу создать функции, которые можно вызывать, как и любые другие функции, но также иметь функции-члены, которые можно вызывать по очереди для получения вывода на основе функции, к которой они присоединены (например, комбинаторы).
IКонечно, я могу добавить членов к функциям следующим образом:
//the functions I want to add additional members to
function hello(x) {
return "Hello " + x;
}
function goodbye(x) {
return "Goodbye " + x;
}
//The function I want as a member of the above functions.
//it creates another function based on the function it is
//attached to.
function double() {
var that = this;
return function(x) {
return that(x) + ", " + that(x);
};
}
//I can attach them manually to the function objects:
hello.double = double;
//calling hello.double()('Joe') results in => "Hello Joe, Hello Joe"
goodbye.double = double;
//calling goodbye.double()('Joe') results in => "Goodbye Joe, Goodbye Joe"
Я мог бы создать функцию, которая расширяет все мои функции с помощью члена double
, но я должен помнить, чтобы вызывать его каждый раз, когда я создаюHey
, Sayonara
и т. Д.Также мои функции приветствия будут иметь все эти члены каждый, непосредственно в объекте функции, для каждого экземпляра.Я бы предпочел поместить их всех в один прототип и сделать его прототипом всех моих функций приветствия.Следующие опции также не работают:
- замена
hello.__proto__
(нестандартный, не работает во всех браузерах) - изменение
Function.prototype
напрямую (добавит этих членов ввсе остальные функции, но они не имеют смысла там - я хочу вызывать double
только для набора моих собственных функций)
Возможно ли даже дать объекту функции пользовательскийпрототип или я застрял с изменением каждого создаваемого объекта функции?
Обновление : я изменил приведенный выше пример, чтобы он больше походил на реальную проблему, над которой я работаю.Речь идет о модификации функциональных объектов не обычных объектов.Конечная цель состоит в том, чтобы включить удобный синтаксис для комбинаторов синтаксического анализа, например (очень упрощенный):
//parses one argument
var arg = …
//parses one function name
var name = …
//parses a function call, e.g. foo(x+y, "test", a*2)
var functionCall = name.then(elem("(")).then(arg.repSep(",")).then(")").into(process(…))
Я хочу иметь возможность добавлять члены к набору функций , поэтому, когдаэти члены вызываются, они возвращают новые функции в зависимости от функции, для которой они были вызваны.Это должно использоваться для комбинаторов парсеров / монадических парсеров.