pdisc/faden.lua
Hybrid Dog e70f51aa32 allow discarding the return values of instructions
M  faden.lua
M  standardbefehlssatz.lua
M  util/standartbefehlssatz_doc.lua
2017-01-03 14:44:06 +01:00

107 lines
2.2 KiB
Lua

local function befehl_ausfuhren(faden)
local is = faden.is
local imms = faden.imms
local vars = faden.vars
local anw = faden.liste[faden.ip]
if not anw then
return false, "Invalid instruction pointer"
end
local befehl, args = unpack(anw)
for i = 1,#is do
local bfunk = is[i][befehl]
if bfunk then
local fa = {}
local ersetzbar = {}
if args then
for i = 1,#args do
local arg = args[i]
if type(arg) == "number" then
fa[i] = imms[arg]
else
fa[i] = vars[arg]
ersetzbar[i] = true
end
end
end
local weiter, ergebnis = bfunk(fa, faden)
if not weiter then
return false, "Command " .. befehl .. ": " .. ergebnis
end
if args
and ergebnis ~= nil then
if type(ergebnis) ~= "table" then
ergebnis = {ergebnis}
end
for i,v in pairs(ergebnis) do
if args[i]
and ersetzbar[i] then
vars[args[i]] = v
end
end
end
faden.ip = faden.ip + 1
if faden.ip > #faden.liste then
return false, "Done"
end
return true
end
end
return false, 'Unknown command "' .. befehl .. '"'
end
local function programm_ausfuhren(faden)
local weiter,msg = befehl_ausfuhren(faden)
if not weiter then
faden.log = faden.log .. "Aborted (" .. faden.ip .. "): " .. msg .. "\n"
faden:exit()
return
end
return not faden.stopped and programm_ausfuhren(faden)
end
return function(faden_manip, parsed)
local faden = {
log = "",
vars = {pi = math.pi},
ip = 1,
sp = 3500,
sb = 3500,
strlen_max = 2000,
stack = {},
is = {pdisc.standard_befehlssatz},
suscitate = programm_ausfuhren,
flush = function(self)
print(self.log)
self.log = ""
return true
end,
stop = function(self)
self.stopped = true
end,
continue = function(self)
self.stopped = false
self:suscitate()
end,
try_rebirth = function(self)
if minetest.get_us_time() >= self.rebirth then
self:continue()
end
end,
exit = function(self)
self:flush()
end,
}
if parsed then
faden.imms = parsed[1]
faden.liste = parsed[2]
if not faden.liste[1] then
faden.suscitate = function(self)
self.log = self.log .. "Nothing to execute.\n"
self:exit()
end
end
end
faden_manip(faden)
return faden
end