|
1 | 1 | package vibes |
2 | 2 |
|
3 | | -import ( |
4 | | - "errors" |
5 | | -) |
6 | | - |
7 | 3 | func (exec *Execution) evalRangeExpr(expr *RangeExpr, env *Env) (Value, error) { |
8 | 4 | startVal, err := exec.evalExpression(expr.Start, env) |
9 | 5 | if err != nil { |
@@ -74,160 +70,3 @@ func (exec *Execution) evalCaseExpr(expr *CaseExpr, env *Env) (Value, error) { |
74 | 70 |
|
75 | 71 | return NewNil(), nil |
76 | 72 | } |
77 | | - |
78 | | -func (exec *Execution) evalForStatement(stmt *ForStmt, env *Env) (Value, bool, error) { |
79 | | - exec.loopDepth++ |
80 | | - defer func() { |
81 | | - exec.loopDepth-- |
82 | | - }() |
83 | | - |
84 | | - iterable, err := exec.evalExpression(stmt.Iterable, env) |
85 | | - if err != nil { |
86 | | - return NewNil(), false, err |
87 | | - } |
88 | | - if err := exec.checkMemoryWith(iterable); err != nil { |
89 | | - return NewNil(), false, err |
90 | | - } |
91 | | - last := NewNil() |
92 | | - |
93 | | - switch iterable.Kind() { |
94 | | - case KindArray: |
95 | | - arr := iterable.Array() |
96 | | - for _, item := range arr { |
97 | | - env.Assign(stmt.Iterator, item) |
98 | | - val, returned, err := exec.evalStatements(stmt.Body, env) |
99 | | - if err != nil { |
100 | | - if errors.Is(err, errLoopBreak) { |
101 | | - return last, false, nil |
102 | | - } |
103 | | - if errors.Is(err, errLoopNext) { |
104 | | - continue |
105 | | - } |
106 | | - return NewNil(), false, err |
107 | | - } |
108 | | - if returned { |
109 | | - return val, true, nil |
110 | | - } |
111 | | - last = val |
112 | | - } |
113 | | - case KindRange: |
114 | | - r := iterable.Range() |
115 | | - if r.Start <= r.End { |
116 | | - for i := r.Start; i <= r.End; i++ { |
117 | | - env.Assign(stmt.Iterator, NewInt(i)) |
118 | | - val, returned, err := exec.evalStatements(stmt.Body, env) |
119 | | - if err != nil { |
120 | | - if errors.Is(err, errLoopBreak) { |
121 | | - return last, false, nil |
122 | | - } |
123 | | - if errors.Is(err, errLoopNext) { |
124 | | - continue |
125 | | - } |
126 | | - return NewNil(), false, err |
127 | | - } |
128 | | - if returned { |
129 | | - return val, true, nil |
130 | | - } |
131 | | - last = val |
132 | | - } |
133 | | - } else { |
134 | | - for i := r.Start; i >= r.End; i-- { |
135 | | - env.Assign(stmt.Iterator, NewInt(i)) |
136 | | - val, returned, err := exec.evalStatements(stmt.Body, env) |
137 | | - if err != nil { |
138 | | - if errors.Is(err, errLoopBreak) { |
139 | | - return last, false, nil |
140 | | - } |
141 | | - if errors.Is(err, errLoopNext) { |
142 | | - continue |
143 | | - } |
144 | | - return NewNil(), false, err |
145 | | - } |
146 | | - if returned { |
147 | | - return val, true, nil |
148 | | - } |
149 | | - last = val |
150 | | - } |
151 | | - } |
152 | | - default: |
153 | | - return NewNil(), false, exec.errorAt(stmt.Pos(), "cannot iterate over %s", iterable.Kind()) |
154 | | - } |
155 | | - |
156 | | - return last, false, nil |
157 | | -} |
158 | | - |
159 | | -func (exec *Execution) evalWhileStatement(stmt *WhileStmt, env *Env) (Value, bool, error) { |
160 | | - exec.loopDepth++ |
161 | | - defer func() { |
162 | | - exec.loopDepth-- |
163 | | - }() |
164 | | - |
165 | | - last := NewNil() |
166 | | - for { |
167 | | - if err := exec.step(); err != nil { |
168 | | - return NewNil(), false, exec.wrapError(err, stmt.Pos()) |
169 | | - } |
170 | | - condition, err := exec.evalExpression(stmt.Condition, env) |
171 | | - if err != nil { |
172 | | - return NewNil(), false, err |
173 | | - } |
174 | | - if err := exec.checkMemoryWith(condition); err != nil { |
175 | | - return NewNil(), false, err |
176 | | - } |
177 | | - if !condition.Truthy() { |
178 | | - return last, false, nil |
179 | | - } |
180 | | - val, returned, err := exec.evalStatements(stmt.Body, env) |
181 | | - if err != nil { |
182 | | - if errors.Is(err, errLoopBreak) { |
183 | | - return last, false, nil |
184 | | - } |
185 | | - if errors.Is(err, errLoopNext) { |
186 | | - continue |
187 | | - } |
188 | | - return NewNil(), false, err |
189 | | - } |
190 | | - if returned { |
191 | | - return val, true, nil |
192 | | - } |
193 | | - last = val |
194 | | - } |
195 | | -} |
196 | | - |
197 | | -func (exec *Execution) evalUntilStatement(stmt *UntilStmt, env *Env) (Value, bool, error) { |
198 | | - exec.loopDepth++ |
199 | | - defer func() { |
200 | | - exec.loopDepth-- |
201 | | - }() |
202 | | - |
203 | | - last := NewNil() |
204 | | - for { |
205 | | - if err := exec.step(); err != nil { |
206 | | - return NewNil(), false, exec.wrapError(err, stmt.Pos()) |
207 | | - } |
208 | | - condition, err := exec.evalExpression(stmt.Condition, env) |
209 | | - if err != nil { |
210 | | - return NewNil(), false, err |
211 | | - } |
212 | | - if err := exec.checkMemoryWith(condition); err != nil { |
213 | | - return NewNil(), false, err |
214 | | - } |
215 | | - if condition.Truthy() { |
216 | | - return last, false, nil |
217 | | - } |
218 | | - val, returned, err := exec.evalStatements(stmt.Body, env) |
219 | | - if err != nil { |
220 | | - if errors.Is(err, errLoopBreak) { |
221 | | - return last, false, nil |
222 | | - } |
223 | | - if errors.Is(err, errLoopNext) { |
224 | | - continue |
225 | | - } |
226 | | - return NewNil(), false, err |
227 | | - } |
228 | | - if returned { |
229 | | - return val, true, nil |
230 | | - } |
231 | | - last = val |
232 | | - } |
233 | | -} |
0 commit comments