1
我試圖實現我自己的自定義總和函數。 我們的目標是要呼籲的是需要4參數 「sumFromTo」功能* iteratorname *從 *到 *功能Mathjs自定義總和函數
其中「功能」可以是一些其他的功能,並在解決方案是總結所有。 例如
// works
sumFromTo(i,1,10,i+1) // = 65
但是,如果我換到其他功能這會打破,因爲mathjs不知道 「X」
// works not because x is undefined
test(x) = sumFromTo(i,1,x,i+1)
test(10)
我的導入是這樣的:
function sumFromTo(iteratorName, from, to, toString, f) {
var total = 0;
var toVal = typeof to == "number" ? to : to.length;
for (var iterator = from; iterator <= toVal; iterator++) {
mathScope[iteratorName] = iterator;
mathScope[toString + "_" + iterator] = to[iterator];
total += math.eval(f, mathScope);
}
return total;
}
sumFromTo.transform = function (args, math, scope) {
/* Iterator */
var iteratorName = "notfound";
if (args[0] instanceof math.expression.node.SymbolNode) {
iteratorName = args[0].name;
} else {
throw new Error('First argument must be a symbol');
}
/* Startvalue of Iterator */
if (args[1] instanceof math.expression.node.ConstantNode) {
if (args[1].value == 0) {
throw new Error('Sum must counting from >=1: 0 given');
}
}
/* to: Array to loop */
if (args[2] instanceof math.expression.node.SymbolNode) {
var toString = args[2].name;
}
/* compile */
var from = args[1].compile().eval(scope);
scope[iteratorName] = from;
var to = args[2].compile().eval(scope);
if (to.constructor.name == "Matrix") {
to = to.toArray();
scope[toString] = to;
}else{
if(typeof to == "object"){
to = to.toArray();
}
}
return sumFromTo(iteratorName, from, to, toString, args[3].toString());
};
sumFromTo.transform.rawArgs = true;
math.import({sumFromTo: sumFromTo}, {override: true});
我創建了一個小提琴https://jsfiddle.net/o49p4zwa/2/,可能有助於理解我的問題。
有人知道我錯過了什麼或者我做錯了什麼嗎?
在此先感謝!
THX你的答案,但我忘了說,這是一種math.js輸入。它的用戶生成並來自前端。我可以在我的.js文件中創建一個名爲「test」的靜態函數。但那不是我想要的..我正在尋找一種動態的方式來定義這個功能。 – jdoeName