Skip to content

Feature request: Advanced constructs #157

Description

@Monniasza

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

Activity

  1. Monniasza commented on Jun 16, 2020

    @Monniasza
    Author

    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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions