Repository navigation
Feature request: Advanced constructs #157
Description
Activity
Strings must be now explicitly stated either by single or double quotation marks, otherwise, they will be treated as variables, which might cause errors.
To create a new key, you must place '+' or '$' before the setter
All other existing syntax will be preserved
Functions
getVar(variable)- get a variable, starting heregetVarRoot(variable)- get a variable by the name, starting from root
or key correspondingly. The first parameter is optional and is used to track the number of calls.- Variables belonging to the local node are obtained by simply typing their name.
- To get variables from ancestors, use
##$...$instead.
regexp(pattern,string)- run regexp expression on a string - sin, cos, tan, log10, ln, log2, expE, exp10, mod, exp, sec, csc, sqrt, curt, root, log - math functions
getKey(...):- 2 inputs: name, index - get a single key by index
- 1 input: name - get all keys by name
- 1 input: key - get key's value
- no inputs - get all keys under all names
getKeyValue(...): LikegetKey(...), but gets values, not the keys themselves.setKey(...):- 3 inputs: key name, index, value - set given key at the given index to the given value
- 2 inputs: key, value: sets given a key to a given value
- 2 inputs: keys, value: sets all given keys to a single value
- 2 inputs: keys, values: sets keys to the corresponding values
- 2 inputs: key name, values: sets keys under given name to the corresponding values
- 2 inputs: key name, value: sets keys under given name to a single value
- If you want to set multiple keys to a list, use
setKeyDuplicatefunction
setKeyDuplicate(...):- 2 inputs: key name, value: sets keys under given name to a single value
- 2 inputs: keys, value: sets all given keys to a single value
call(func, inputs): calls a function with given list of inputsgetKey(...):- 2 inputs: name, index - get a single key by index
- 1 input: name - get all keys by name
- 1 input: key - get key's value
- no inputs - get all keys under all names
getNodeValue(...): LikegetNode(...), but gets values, not the nodes themselves.setNode(...):- 3 inputs: node name, index, value - set given node at the given index to the given value
- 2 inputs: node, value: sets given a node to a given value
- 2 inputs: nodes, value: sets all given nodes to a single value
- 2 inputs: nodes, values: sets nodes to the corresponding values
- 2 inputs: node name, values: sets nodes under given name to the corresponding values
- 2 inputs: node name, value: sets nodes under given name to a single value
- If you want to set multiple nodes to a list, use
setKeyDuplicatefunction
setNodeDuplicate(...):- 2 inputs: node name, value: sets nodes under given name to a single value
- 2 inputs: nodes, value: sets all given nodes to a single value
Setter prefixes
'$' as a modifier - creates a temporary variable
'$$' as a modifier - creates a long-term variable, but it is removed after all scripts finish.Basic data types
String, node, key, number, boolean, list, anonymous function
Advanced data types
Achieved through specialized functions.
Operators
- + adddition
- - substraction
- * multiplication
- / division
- ^ exponent
- | OR
- ! NOT
- & AND
- \ XOR
- !| NOR
- !& NAND
- !\ XNOR
- = equal
- > more
- < less
- <= !> not more
- >= !< not less
- <> != not equal
Grouping
- () parentheses
- <% ... %> code sections (they do not start a new node).
- [[...]] - list
Why double brackets?
Double symbols are much rarer in the text - to say text explicitly, use quotation marks.
Where?
It will need a new file format - which distinguishes it from simpler patches.
Suggestions for file extension:- mm - from 'module manager'
- akp - from 'advanced kerbal patch'
- kscript - from 'kerbal script'
- kpscript - from 'kerbal patch script'
Why?
- KSP API is too complex for beginners
- Existing capabilities are insufficient for extremely advanced users
How?
Existing patches should not be called 'scripts' - they will be more advanced form of data.
Constructs
- Define function:
FUNCTIONDEF[...] <%...%>. Place inputs within square brackets, and in double curly brackets place code. TheFUNCTIONDEFis a reserved name in this programming language (but not in CFG files). The first input names the function, following ones are input variable names. - Define anonymous function:
FUNCTIONANONYM[...] <%...%>. Place inputs within square brackets, and in double curly brackets place code. TheFUNCTIONANONYMis a reserved name in this programming language (but not in CFG files). for($x = 0; #$x# < 10; @x += 1)- a 'for' loopforeach($x = 0;@NODE[y]) <%...%>orforeach($x = 0;#key) <%...%>and - runs an action for every node or keyif(cond) <%...%> elseif(cond2) <%...%>} else <%...%>}- conditional statementfornode(node) <%...%>- run given code for a given node- `try <%...%> catch($exc) <%...%> - if first block throws an error or exception, call second block
'-' with text
"qwertyuiop" - 3= "qwertyu"
3 - "qwertyuiop"= "rtyuiop"
3 - "qwertyuiop" - 3= "rtyu"Remove the last instance:
"anobnoa" -< "no" = "anoba" Remove last instance
"anobnoa" >- "no" = "abnoa" Remove first instance
"anobnoa" - "no" = "aba" Remove all instances
This suggestion presents a new programming language for use in KSP.