52 lines
930 B
Plaintext
52 lines
930 B
Plaintext
|
local ForthStack = {}
|
||
|
|
||
|
|
||
|
|
||
|
global type Stack = record
|
||
|
contents: {any}
|
||
|
top: number
|
||
|
push: function(Stack, any)
|
||
|
pop: function(Stack)
|
||
|
new: function(Stack): Stack
|
||
|
end
|
||
|
function Stack:push(val: any)
|
||
|
self.top = self.top + 1
|
||
|
table.insert(self.contents,val)
|
||
|
end
|
||
|
function Stack:pop(): any
|
||
|
self.top = self.top -1
|
||
|
if self.top < 0 then
|
||
|
error("Stack underflow")
|
||
|
end
|
||
|
return table.remove(self.contents)
|
||
|
end
|
||
|
local stack_mt = {__index = Stack}
|
||
|
function Stack:new(): Stack
|
||
|
return setmetatable({contents = {}, top = 0} as Stack, stack_mt)
|
||
|
end
|
||
|
|
||
|
|
||
|
-- operations
|
||
|
function ForthStack.add(stack: Stack)
|
||
|
local a: any =stack:pop()
|
||
|
local b: any=stack:pop()
|
||
|
if a is number and b is number then
|
||
|
local c=a+b
|
||
|
stack:push(c)
|
||
|
else
|
||
|
error("invalid operands for add operation!")
|
||
|
end
|
||
|
end
|
||
|
function ForthStack.dot(s: Stack)
|
||
|
print(s:pop())
|
||
|
end
|
||
|
local s = Stack:new()
|
||
|
s:push(1)
|
||
|
s:push(4)
|
||
|
ForthStack.add(s)
|
||
|
print(ForthStack.dot(s))
|
||
|
|
||
|
|
||
|
|
||
|
return ForthStack
|