commands are read line by line ```[:] [ [[,]``` arguments can be either variables, labels or immediates,
labels are replaced with immediates which have the line numbers of the labels as their values
true/false: boolean (immediate)
12.6: number (immediate)
$hello nwae: string (immediate)
nodolla: either a label is called so (immediate) or it's a variable
If you want to use : in a string, you need to put it at the beginning of the line to not treat the left part as label ### Types Name | Description ----|------------- e| anything defined v| any variable ve| any defined variable s| string vs| string variable n| number vn| number variable ui| unsigned integer number b| bool vb| bool variable ### Instructions Name | Parameters | Description -----|------------|------------ mov | `, ` | `to <= from`; Copies from into to. xchg | `, ` | `a,b <= b,a`; Switches a with b. getvar | `[, ]` | Sets varname to the current variable called if it's set. If exists is passed, it's set to a bool indicating whether the variable was set. copytable | `, ` | Copies ${origin}.* to ${target}.*. add | `, ` | `to <= to + from` add | `[, [, […]]]` | `to <= to ∨ ba ∨ bb ∨ …`; logical or: *to* indicates whether at least one of the arguments is true add | `, ` | `to <= to .. from`; string concatenation sub | `, ` | `num <= num - tosub` sub | `, [, ]` | `str <= str:sub(start, end)`; substring mul | `, ` | `to <= to * from`; multiplication mul | `[, [, […]]]` | `to <= to ∧ ba ∧ bb ∧ …`; logical and: *to* indicates whether all of the arguments are true mul | `, ` | `str <= str:rep(cnt)`; repeating a string cnt times div | `, ` | `num <= num / todiv`; division inc | `` | `num <= num + 1` dec | `` | `num <= num - 1` neg | `` | `num <= -num`; negation neg | `` | `var <= ¬var`; logical not neg | `` | `str <= str:rev()`; reverts a string inv | `` | `num <= 1 / num` mod | `, ` | `num <= num mod dv`; modulo jmp | `[, ]` | jump; If *cond* is not *false*, the instruction pointer is set to *target*. To disallow infinite loops, the program is interrupted after changing it, mods may have different heuristics about restarting it then. call | `[, ]` | same as pushing the current instruction pointer and then jumping (see jmp); used to execute subroutines ret | no arguments | pop some unsigned integer, then jump there; used to exit subroutines push | `[, [, […]]]` | put values onto the stack; from left to right pop | `[, [, […]]]` | takes values from the stack and sets the passed variables to them; the last variable must be a defined one; from left to right equal | `, ` | `a <= (a = b)`; equality less | `, ` | `a <= (a < b)`; after executing, a is a bool less | `, ` | `a <= (a < b)`; less also works for strings, it compares characters from left to right, see man ASCII for the order greater | `, ` | executes less b,a usleep | `` | aborts the program for at least ⌊max{0, t}⌋ microseconds sleep | `` | executes usleep with t * 1000000 as argument get_us_time | `` | stores current time in microsecond precision into *to*; can be used to measure time differences tostring | `` | Sets *var* to a string representing its value; if it's not defined, it's set to `$nil`, if it's a boolean, it's set to `$true` or `$false` tonumber | `` | Sets *var* to a number representing its value toboolean | `` | If *var* is `false` or not defined, it's set to `false`, else it's set to `true`. print | `[, [, […]]]` | adds variables to the log, seperated by \t (tab), \n (newline) is added at the end flush | no arguments | Output the log, what exactly happens should vary for every mod. How mods can use this mod: ``` local mylog = print local parsed_code = pdisc.parse(code_text) local function mystart(parsed_code) local thread = pdisc.create_thread(function(thread) thread.flush = function(self) mylog(self.log) self.log = "" return true end end, parsed_code) thread:suscitate() mykeepalive(thread) end mystart(parsed_code) local function mykeepalive(thread) if not thread.stopped then return end thread:try_rebirth() minetest.after(0.1, function() mykeepalive() end) end ``` TODO: * add string. instructions * security: test table copy functions * update README