13 func (stk stack) isEmpty() bool {
14 return stk.stackEntry == nil
17 func (stk stack) top() string {
24 func (stk stack) add(str string) stack {
32 func (stk stack) addFromStack(other stack) stack {
36 res := stk.addFromStack(other.drop())
37 return res.add(other.top())
40 func (stk stack) drop() stack {
47 func (stk stack) dropN(n int) stack {
55 func (stk stack) recurFind(str string) int {
62 res := stk.drop().recurFind(str)
69 func (stk stack) count() map[string]int {
73 stackCounts := make(map[string]int)
75 stackCounts[stk.str]++
77 if stk.stackEntry == nil {
84 func (stk stack) find(str string) int {
85 stackCounts := stk.count()
86 if stk.isEmpty() || stackCounts[str] == 0 {
93 if stackCounts[str] == 1 {
99 if stk.stackEntry == nil {
107 func (stk stack) roll(n int) stack {
108 var x func(stack, int) (stack, string)
109 x = func(stk stack, n int) (stack, string) {
111 return stk.drop(), stk.top()
113 stk2, entry := x(stk.drop(), n-1)
114 return stk2.add(stk.top()), entry
116 stk, entry := x(stk, n)
117 return stk.add(entry)
120 func (stk stack) swap() stack {
125 return stk.add(a).add(b)
128 func (stk stack) dup() stack {
129 return stk.add(stk.top())
132 func (stk stack) over() stack {
133 t := stk.drop().top()
137 func (stk stack) pick(n int) stack {
138 t := stk.dropN(n).top()
142 func (stk stack) String() string {
143 if stk.stackEntry == nil {
146 var x func(stk stack) string
147 x = func(stk stack) string {
148 if stk.stackEntry == nil {
151 return x(stk.drop()) + " " + stk.stackEntry.str
153 return "[..." + x(stk) + "]"