1
0
mirror of https://github.com/HybridDog/pdisc.git synced 2024-11-05 09:50:26 +01:00
a mod supposed to be used for programming robots in minetest https://github.com/HybridDog/pdisc
Go to file
2022-07-02 13:26:22 +02:00
util README: fix developer note 2017-08-24 18:12:02 +02:00
.gitignore 💥 2016-11-13 14:42:57 +01:00
faden.lua Fix exit and show source line numbers 2017-04-13 23:05:50 +02:00
init.lua 💥 2016-11-13 14:42:57 +01:00
LICENSE.txt 💥 2016-11-13 14:42:57 +01:00
mod.conf Add mod.conf 2022-07-02 13:26:22 +02:00
parser.lua Fix true and false 2017-06-26 19:39:20 +02:00
README.md README: fix developer note 2017-08-24 18:12:02 +02:00
standardbefehlssatz.lua Add a missing parameter to mul 2021-01-17 17:16:35 +01:00

commands are read line by line

[<labelname>:] [<commandname> [<arg1>[,<arg2[…]]]] [; <comment>]

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 <v to>, <e from> to <= from; Copies from into to.
xchg <v a>, <v b> a,b <= b,a; Switches a with b.
getvar <vs varname>[, <ve exists>] 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 <s target>, <s origin> Copies ${origin}.* to ${target}.*.
add <vn to>, <n from> to <= to + from
add <vb to>[, <b ba>[, <b bb>[…]]] to <= to ba bb ; logical or: to indicates whether at least one of the arguments is true
add <vs to>, <s from> to <= to .. from; string concatenation
sub <vn num>, <n tosub> num <= num - tosub
sub <vs str>, <n start>[, <n end>] str <= str:sub(start, end); substring
mul <vn to>, <n from> to <= to * from; multiplication
mul <vb to>[, <b ba>[, <b bb>[…]]] to <= to ∧ ba ∧ bb ∧ …; logical and: to indicates whether all of the arguments are true
mul <vs str>, <n cnt> str <= str:rep(cnt); repeating a string cnt times
div <vn num>, <n todiv> num <= num / todiv; division
inc <vn num> num <= num + 1
dec <vn num> num <= num - 1
neg <vn num> num <= -num; negation
neg <vb var> var <= ¬var; logical not
neg <vs str> str <= str:rev(); reverts a string
inv <vn num> num <= 1 / num
mod <vn num>, <n dv> num <= num mod dv; modulo
jmp <ui target>[, <e cond>] 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 <ui target>[, <e cond>] 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 <e a>[, <e b>[, <e c>[…]]] put values onto the stack; from left to right
pop <v a>[, <v b>[, <v c>[…]]] 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 <v a>, <e b> a <= (a = b); equality
less <vn a>, <n b> a <= (a < b); after executing, a is a bool
less <vs a>, <s b> a <= (a < b); less also works for strings, it compares characters from left to right, see man ASCII for the order
greater <v a>, <e b> executes less b,a
usleep <n t> aborts the program for at least ⌊max{0, t}⌋ microseconds
sleep <n t> executes usleep with t * 1000000 as argument
get_us_time <v to> stores current time in microsecond precision into to; can be used to measure time differences
tostring <v var> 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 <v var> Sets var to a number representing its value
toboolean <v var> If var is false or not defined, it's set to false, else it's set to true.
print <e a>[, <e b>[, <e c>[…]]] 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