ModuleManager icon indicating copy to clipboard operation
ModuleManager copied to clipboard

Feature request: Advanced constructs

Open Monniasza opened this issue 5 years ago • 1 comments

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

Monniasza avatar Jun 15 '20 10:06 Monniasza

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

Monniasza avatar Jun 16 '20 19:06 Monniasza