2017-02-02 65 views
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/,可能有助於理解我的問題。

有人知道我錯過了什麼或者我做錯了什麼嗎?

在此先感謝!

回答

0

你需要的是封閉

test = function(x) { 
    sumFromTo(i,1,x,i+1) 
} 
test(10) 
+0

THX你的答案,但我忘了說,這是一種math.js輸入。它的用戶生成並來自前端。我可以在我的.js文件中創建一個名爲「test」的靜態函數。但那不是我想要的..我正在尋找一種動態的方式來定義這個功能。 – jdoeName