basic: defun f call to run on complex expr as argument, not just a constant you dumbass

This commit is contained in:
minjaesong
2020-12-28 10:04:23 +09:00
parent d379abbc3e
commit b00ac13cd2
2 changed files with 10 additions and 3 deletions

View File

@@ -0,0 +1,8 @@
1 optiontrace 1:optiondebug 1
10 defun fun(x)=2^x
20 defun apply(f,x)=f((x+1)/2)
30 k=apply(fun,6)
40 print k
50 print typeof k
60 unresolve k
70 resolve k

View File

@@ -2839,9 +2839,8 @@ bF._executeSyntaxTree = function(lnum, stmtnum, syntaxTree, recDepth) {
}
// userdefun with args
// apply given arguments (syntaxTree.astLeaves) to the expression tree and evaluate it
// if tree has leaves and their leaves are all terminal leaves (does not have grandchild AND they are not usrdefun)
else if (syntaxTree.astType == "usrdefun" && syntaxTree.astLeaves[0] !== undefined &&
syntaxTree.astLeaves.every(child => child.astLeaves[0] == undefined && child.astType !== "usrdefun")) {
// if tree has leaves:
else if (syntaxTree.astType == "usrdefun" && syntaxTree.astLeaves[0] !== undefined) {
let oldTree = syntaxTree.astValue;
let argsTro = syntaxTree.astLeaves.map(it => bF._executeSyntaxTree(lnum, stmtnum, it, recDepth + 1));
let newTree = oldTree; // curryDefun() will make a clone of it for us