sarbian/ModuleManager

Feature request: Advanced constructs

Monniasza opened this issue · 1 comments

This suggestion presents a new programming language for use in KSP.

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 here
  • getVarRoot(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(...): Like getKey(...), 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 setKeyDuplicate function
  • 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 inputs
  • 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
  • getNodeValue(...): Like getNode(...), 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 setKeyDuplicate function
  • 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. The FUNCTIONDEF is 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. The FUNCTIONANONYM is a reserved name in this programming language (but not in CFG files).
  • for($x = 0; #$x# < 10; @x += 1) - a 'for' loop
  • foreach($x = 0;@NODE[y]) <%...%> or foreach($x = 0;#key) <%...%>and - runs an action for every node or key
  • if(cond) <%...%> elseif(cond2) <%...%>} else <%...%>} - conditional statement
  • fornode(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