(let stack (fun () { (mut data []) (let push (fun (value) (set data (concat [value] data)))) (let popTop (fun () { (let res (head data)) (pop! data 0) res })) (let isEmpty? (fun () (empty? data))) (fun (&data &push &popTop &isEmpty?) ()) })) (let myStack (stack)) (myStack.push 1) (myStack.push 2) (myStack.push 3) (print myStack.data) (print "top: " (myStack.popTop)) (print myStack.data) (print "empty: " (myStack.isEmpty?)) (myStack.popTop) (myStack.popTop) (print "empty: " (myStack.isEmpty?))