forth-stuff/ForthStack.tl

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