forked from ground/ground
		
	Functions can return lists
This commit is contained in:
		
							
								
								
									
										32
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								src/main.cpp
									
									
									
									
									
								
							| @@ -434,7 +434,7 @@ bool isListRef(string in) { | ||||
| bool isType(string in) { | ||||
|     if (in.size() >= 1 && in[0] == '-') { | ||||
|         string type = in.substr(1); | ||||
|         if (type == "string" || type == "char" || type == "bool" || type == "double" || type == "int") return true;  | ||||
|         if (type == "string" || type == "char" || type == "bool" || type == "double" || type == "int" || type == "list") return true;  | ||||
|         else return false; | ||||
|     } else return false; | ||||
| } | ||||
| @@ -1771,6 +1771,8 @@ Literal exec(vector<Instruction> in, bool executingFunction) { | ||||
|                 } | ||||
|                 if (holds_alternative<Literal>(l.args[0])) { | ||||
|                     return get<Literal>(l.args[0]); | ||||
|                 } else if (holds_alternative<ListRef>(l.args[0])) { | ||||
|                     return variables[get<ListRef>(l.args[0]).listName]; | ||||
|                 } else { | ||||
|                     error("First argument of return must be a literal value/value reference"); | ||||
|                 } | ||||
| @@ -1792,8 +1794,10 @@ Literal exec(vector<Instruction> in, bool executingFunction) { | ||||
|                 } | ||||
|                 if (holds_alternative<Literal>(l.args[0])) { | ||||
|                     fnArgs.push_back(get<Literal>(l.args[0])); | ||||
|                 } else if (holds_alternative<ListRef>(l.args[0])) { | ||||
|                     fnArgs.push_back(variables[get<ListRef>(l.args[0]).listName]); | ||||
|                 } else { | ||||
|                     error("First argument of pusharg must be a literal"); | ||||
|                     error("First argument of pusharg must be a literal or list reference"); | ||||
|                 } | ||||
|                 break; | ||||
|             /* | ||||
| @@ -1807,7 +1811,9 @@ Literal exec(vector<Instruction> in, bool executingFunction) { | ||||
|                     } | ||||
|          | ||||
|                     FunctionRef ref; | ||||
|                     Direct returnRef; | ||||
|                     string returnRef; | ||||
|  | ||||
|                     bool expectList = true; | ||||
|          | ||||
|                     if (holds_alternative<FunctionRef>(l.args[0])) { | ||||
|                         ref = get<FunctionRef>(l.args[0]); | ||||
| @@ -1816,9 +1822,12 @@ Literal exec(vector<Instruction> in, bool executingFunction) { | ||||
|                     } | ||||
|  | ||||
|                     if (holds_alternative<Direct>(l.args[1])) { | ||||
|                         returnRef = get<Direct>(l.args[1]); | ||||
|                         returnRef = get<Direct>(l.args[1]).varName; | ||||
|                     } else if (holds_alternative<ListRef>(l.args[1])) { | ||||
|                         returnRef = get<ListRef>(l.args[1]).listName; | ||||
|                         expectList = true; | ||||
|                     } else { | ||||
|                         error("Second argument of call must be a direct reference"); | ||||
|                         error("Second argument of call must be a direct reference or list reference"); | ||||
|                     } | ||||
|  | ||||
|                     // Check for external function | ||||
| @@ -1841,7 +1850,7 @@ Literal exec(vector<Instruction> in, bool executingFunction) { | ||||
|              | ||||
|                         // Clear arguments and store result | ||||
|                         fnArgs.clear(); | ||||
|                         variables[returnRef.varName] = resultLit; | ||||
|                         variables[returnRef] = resultLit; | ||||
|  | ||||
|                         break; | ||||
|                     } | ||||
| @@ -1885,8 +1894,15 @@ Literal exec(vector<Instruction> in, bool executingFunction) { | ||||
|                     fnArgs.clear(); | ||||
|  | ||||
|                     // Now, assign the return value in the current scope. | ||||
|                     bool existed = variables.count(returnRef.varName) > 0; | ||||
|                     variables[returnRef.varName] = retVal; | ||||
|                     if (expectList) { | ||||
|                         variables[returnRef] = retVal; | ||||
|                     } else { | ||||
|                         if (holds_alternative<List>(retVal.val)) { | ||||
|                             error("Expecting to output a normal literal to a normal literal"); | ||||
|                         } else { | ||||
|                             variables[returnRef] = retVal; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 break; | ||||
|             case Instructions::Use: | ||||
|   | ||||
| @@ -17,3 +17,25 @@ endfun | ||||
| call !jumpy &tmp | ||||
|  | ||||
| stdlnout "I called a function" | ||||
|  | ||||
| # This function returns a list | ||||
|  | ||||
| fun -list !dingus | ||||
|     stdlnout "Testing lists in functions" | ||||
|     setlist *dingle "heheheha" "hahahahe" "hmmm" | ||||
|     return *dingle | ||||
| endfun | ||||
|  | ||||
| call !dingus *outlist | ||||
|  | ||||
| getlistsize *outlist &size | ||||
| set &counter 0 | ||||
| @loopstart | ||||
| equal $size $counter &cond | ||||
| if $cond %loopend | ||||
| getlistat *outlist $counter &tmp | ||||
| stdlnout $tmp | ||||
| add 1 $counter &counter | ||||
| jump %loopstart | ||||
| @loopend | ||||
| end 0 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user