OSDN Git Service

modify equitycmd from commandline to filename
[bytom/equity.git] / compiler / stack.go
1 package compiler
2
3 type (
4         stack struct {
5                 *stackEntry
6         }
7         stackEntry struct {
8                 str  string
9                 prev *stackEntry
10         }
11 )
12
13 func (stk stack) isEmpty() bool {
14         return stk.stackEntry == nil
15 }
16
17 func (stk stack) top() string {
18         if stk.isEmpty() {
19                 return ""
20         }
21         return stk.str
22 }
23
24 func (stk stack) add(str string) stack {
25         e := &stackEntry{
26                 str:  str,
27                 prev: stk.stackEntry,
28         }
29         return stack{e}
30 }
31
32 func (stk stack) addFromStack(other stack) stack {
33         if other.isEmpty() {
34                 return stk
35         }
36         res := stk.addFromStack(other.drop())
37         return res.add(other.top())
38 }
39
40 func (stk stack) drop() stack {
41         if !stk.isEmpty() {
42                 stk = stack{stk.prev}
43         }
44         return stk
45 }
46
47 func (stk stack) dropN(n int) stack {
48         for n > 0 {
49                 stk = stk.drop()
50                 n--
51         }
52         return stk
53 }
54
55 func (stk stack) find(str string) int {
56         if stk.isEmpty() {
57                 return -1
58         }
59         if stk.str == str {
60                 return 0
61         }
62         res := stk.drop().find(str)
63         if res < 0 {
64                 return res
65         }
66         return res + 1
67 }
68
69 func (stk stack) roll(n int) stack {
70         var x func(stack, int) (stack, string)
71         x = func(stk stack, n int) (stack, string) {
72                 if n == 0 {
73                         return stk.drop(), stk.top()
74                 }
75                 stk2, entry := x(stk.drop(), n-1)
76                 return stk2.add(stk.top()), entry
77         }
78         stk, entry := x(stk, n)
79         return stk.add(entry)
80 }
81
82 func (stk stack) swap() stack {
83         a := stk.top()
84         stk = stk.drop()
85         b := stk.top()
86         stk = stk.drop()
87         return stk.add(a).add(b)
88 }
89
90 func (stk stack) dup() stack {
91         return stk.add(stk.top())
92 }
93
94 func (stk stack) over() stack {
95         t := stk.drop().top()
96         return stk.add(t)
97 }
98
99 func (stk stack) pick(n int) stack {
100         t := stk.dropN(n).top()
101         return stk.add(t)
102 }
103
104 func (stk stack) String() string {
105         if stk.stackEntry == nil {
106                 return "[]"
107         }
108         var x func(stk stack) string
109         x = func(stk stack) string {
110                 if stk.stackEntry == nil {
111                         return ""
112                 }
113                 return x(stk.drop()) + " " + stk.stackEntry.str
114         }
115         return "[..." + x(stk) + "]"
116 }