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