prelude.lua
· 1.3 KiB · Lua
Raw
Playground
local function push(self, value)
self.n = self.n + 1
table.insert(self, value)
end
local function pop(self)
local value = self[self.n]
self[self.n] = nil
self.n = self.n - 1
return value
end
local function peek(self)
return self[self.n]
end
local function create_stack(object, name)
object[name] = { n = 0 , push = push, pop = pop, peek = peek }
end
LOBBY = {}
create_stack(LOBBY, "lobby")
LOBBY["lobby"]:push(LOBBY)
function PUSH(stack, value)
if not LOBBY[stack] then create_stack(LOBBY, stack) end
LOBBY[stack]:push(value)
end
function PEEK(stack)
assert(LOBBY[stack], "Stack underflow")
assert(LOBBY[stack].n > 0, "Stack underflow")
return LOBBY[stack]:peek()
end
function POP(stack)
assert(LOBBY[stack], "Stack underflow")
assert(LOBBY[stack].n > 0, "Stack underflow")
return LOBBY[stack]:pop()
end
function PUSHTO(object, stack, value)
if not object[stack] then
create_stack(object, stack)
end
object[stack]:push(value)
end
function POPFROM(object, stack)
assert(object[stack], "Stack underflow in external object.")
assert(object[stack].n > 0, "Stack underflow in external object.")
return object[stack]:pop()
end
function _become()
LOBBY = POP('')
end
function _me()
PUSH('', LOBBY)
end
function _object()
PUSH('', {})
end
1 | local function push(self, value) |
2 | self.n = self.n + 1 |
3 | table.insert(self, value) |
4 | end |
5 | |
6 | local function pop(self) |
7 | local value = self[self.n] |
8 | self[self.n] = nil |
9 | self.n = self.n - 1 |
10 | return value |
11 | end |
12 | |
13 | local function peek(self) |
14 | return self[self.n] |
15 | end |
16 | |
17 | local function create_stack(object, name) |
18 | object[name] = { n = 0 , push = push, pop = pop, peek = peek } |
19 | end |
20 | |
21 | LOBBY = {} |
22 | create_stack(LOBBY, "lobby") |
23 | LOBBY["lobby"]:push(LOBBY) |
24 | |
25 | function PUSH(stack, value) |
26 | if not LOBBY[stack] then create_stack(LOBBY, stack) end |
27 | LOBBY[stack]:push(value) |
28 | end |
29 | |
30 | function PEEK(stack) |
31 | assert(LOBBY[stack], "Stack underflow") |
32 | assert(LOBBY[stack].n > 0, "Stack underflow") |
33 | return LOBBY[stack]:peek() |
34 | end |
35 | |
36 | function POP(stack) |
37 | assert(LOBBY[stack], "Stack underflow") |
38 | assert(LOBBY[stack].n > 0, "Stack underflow") |
39 | return LOBBY[stack]:pop() |
40 | end |
41 | |
42 | function PUSHTO(object, stack, value) |
43 | if not object[stack] then |
44 | create_stack(object, stack) |
45 | end |
46 | object[stack]:push(value) |
47 | end |
48 | |
49 | function POPFROM(object, stack) |
50 | assert(object[stack], "Stack underflow in external object.") |
51 | assert(object[stack].n > 0, "Stack underflow in external object.") |
52 | return object[stack]:pop() |
53 | end |
54 | |
55 | function _become() |
56 | LOBBY = POP('') |
57 | end |
58 | |
59 | function _me() |
60 | PUSH('', LOBBY) |
61 | end |
62 | |
63 | function _object() |
64 | PUSH('', {}) |
65 | end |
66 |