@@ -6,6 +6,18 @@ import v.ast
66
77fn (e &Eval) infix_expr (left Object, right Object, op token.Kind, expecting ast.Type) Object {
88 match op {
9+ .and {
10+ if left is bool && right is bool {
11+ return left && right
12+ }
13+ e.error ('invalid operands to &&: ${left .type_name ()} and ${right .type_name ()}' )
14+ }
15+ .logical_or {
16+ if left is bool && right is bool {
17+ return left || right
18+ }
19+ e.error ('invalid operands to ||: ${left .type_name ()} and ${right .type_name ()}' )
20+ }
921 .gt {
1022 match left {
1123 Int {
@@ -120,6 +132,120 @@ fn (e &Eval) infix_expr(left Object, right Object, op token.Kind, expecting ast.
120132 }
121133 }
122134 }
135+ .ge {
136+ match left {
137+ Int {
138+ match right {
139+ Int { return left.val > = right.val }
140+ Uint { return left.val > = right.val }
141+ Float { return left.val > = right.val }
142+ i64 { return left.val > = right }
143+ f64 { return left.val > = right }
144+ else { e.error ('invalid operands to >=: Int and ${right .type_name ()}' ) }
145+ }
146+ }
147+ Uint {
148+ match right {
149+ Int { return left.val > = right.val }
150+ Uint { return left.val > = right.val }
151+ Float { return left.val > = right.val }
152+ i64 { return left.val > = right }
153+ f64 { return left.val > = right }
154+ else { e.error ('invalid operands to >=: Uint and ${right .type_name ()}' ) }
155+ }
156+ }
157+ Float {
158+ match right {
159+ Int { return left.val > = right.val }
160+ Uint { return left.val > = right.val }
161+ Float { return left.val > = right.val }
162+ i64 { return left.val > = right }
163+ f64 { return left.val > = right }
164+ else { e.error ('invalid operands to >=: Float and ${right .type_name ()}' ) }
165+ }
166+ }
167+ i64 {
168+ match right {
169+ Int { return left > = right.val }
170+ Uint { return left > = right.val }
171+ Float { return left > = right.val }
172+ i64 { return left > = right }
173+ f64 { return left > = right }
174+ else { e.error ('invalid operands to >=: int literal and ${right .type_name ()}' ) }
175+ }
176+ }
177+ f64 {
178+ match right {
179+ Int { return left > = right.val }
180+ Uint { return left > = right.val }
181+ Float { return left > = right.val }
182+ i64 { return left > = right }
183+ f64 { return left > = right }
184+ else { e.error ('invalid operands to >=: float literal and ${right .type_name ()}' ) }
185+ }
186+ }
187+ else {
188+ e.error ('invalid operands to >=: ${left .type_name ()} and ${right .type_name ()}' )
189+ }
190+ }
191+ }
192+ .le {
193+ match left {
194+ Int {
195+ match right {
196+ Int { return left.val < = right.val }
197+ Uint { return left.val < = right.val }
198+ Float { return left.val < = right.val }
199+ i64 { return left.val < = right }
200+ f64 { return left.val < = right }
201+ else { e.error ('invalid operands to <=: Int and ${right .type_name ()}' ) }
202+ }
203+ }
204+ Uint {
205+ match right {
206+ Int { return left.val < = right.val }
207+ Uint { return left.val < = right.val }
208+ Float { return left.val < = right.val }
209+ i64 { return left.val < = right }
210+ f64 { return left.val < = right }
211+ else { e.error ('invalid operands to <=: Uint and ${right .type_name ()}' ) }
212+ }
213+ }
214+ Float {
215+ match right {
216+ Int { return left.val < = right.val }
217+ Uint { return left.val < = right.val }
218+ Float { return left.val < = right.val }
219+ i64 { return left.val < = right }
220+ f64 { return left.val < = right }
221+ else { e.error ('invalid operands to <=: Float and ${right .type_name ()}' ) }
222+ }
223+ }
224+ i64 {
225+ match right {
226+ Int { return left < = right.val }
227+ Uint { return left < = right.val }
228+ Float { return left < = right.val }
229+ i64 { return left < = right }
230+ f64 { return left < = right }
231+ else { e.error ('invalid operands to <=: int literal and ${right .type_name ()}' ) }
232+ }
233+ }
234+ f64 {
235+ match right {
236+ Int { return left < = right.val }
237+ Uint { return left < = right.val }
238+ Float { return left < = right.val }
239+ i64 { return left < = right }
240+ f64 { return left < = right }
241+ else { e.error ('invalid operands to <=: float literal and ${right .type_name ()}' ) }
242+ }
243+ }
244+ else {
245+ e.error ('invalid operands to <=: ${left .type_name ()} and ${right .type_name ()}' )
246+ }
247+ }
248+ }
123249 .eq {
124250 match left {
125251 Int {
0 commit comments