feat: add == and != operators for bool, number, and string types with type-checking
Implement equality and inequality operators across three primitive types in the compiler and runtime. Add `bool_eqeq`/`bool_bangeq`, `num_eqeq`/`num_bangeq`, and `string_eqeq`/`string_bangeq` primitives that return false/true respectively when comparing against incompatible types. Update the parse rule table with `INFIX_OPERATOR` macros for `TOKEN_EQEQ` and `TOKEN_BANGEQ` at `PREC_COMPARISON` precedence. Include test files `bool_equality.wren`, `number_equality.wren`, and `string_equality.wren` covering cross-type comparisons and edge cases.
This commit is contained in:
@@ -1 +1,3 @@
|
||||
io.write({ 123 }.call) // expect: 123
|
||||
|
||||
// TODO(bob): Arguments.
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
io.write(true == true) // expect: true
|
||||
io.write(true == false) // expect: false
|
||||
io.write(false == true) // expect: false
|
||||
io.write(false == false) // expect: true
|
||||
|
||||
// Not equal to other types.
|
||||
io.write(true == 1) // expect: false
|
||||
io.write(false == 0) // expect: false
|
||||
io.write(true == "true") // expect: false
|
||||
io.write(false == "false") // expect: false
|
||||
io.write(false == "") // expect: false
|
||||
|
||||
io.write(true != true) // expect: false
|
||||
io.write(true != false) // expect: true
|
||||
io.write(false != true) // expect: true
|
||||
io.write(false != false) // expect: false
|
||||
|
||||
// Not equal to other types.
|
||||
io.write(true != 1) // expect: true
|
||||
io.write(false != 0) // expect: true
|
||||
io.write(true != "true") // expect: true
|
||||
io.write(false != "false") // expect: true
|
||||
io.write(false != "") // expect: true
|
||||
@@ -5,5 +5,25 @@ io.write(2 + 3 * 4) // expect: 14
|
||||
// * has higher precedence than -.
|
||||
io.write(20 - 3 * 4) // expect: 8
|
||||
|
||||
// / has higher precedence than +.
|
||||
io.write(2 + 6 / 3) // expect: 4
|
||||
|
||||
// / has higher precedence than -.
|
||||
io.write(2 - 6 / 3) // expect: 0
|
||||
|
||||
// < has higher precedence than ==.
|
||||
io.write(false == 2 < 1) // expect: true
|
||||
|
||||
// > has higher precedence than ==.
|
||||
io.write(false == 1 > 2) // expect: true
|
||||
|
||||
// <= has higher precedence than ==.
|
||||
io.write(false == 2 <= 1) // expect: true
|
||||
|
||||
// >= has higher precedence than ==.
|
||||
io.write(false == 1 >= 2) // expect: true
|
||||
|
||||
// TODO(bob): %, associativity.
|
||||
|
||||
// Using () for grouping.
|
||||
io.write((2 * (6 - (2 + 2)))) // expect: 4
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
io.write(123 == 123) // expect: true
|
||||
io.write(123 == 124) // expect: false
|
||||
io.write(-3 == 3) // expect: false
|
||||
|
||||
// Not equal to other types.
|
||||
io.write(123 == "123") // expect: false
|
||||
io.write(1 == true) // expect: false
|
||||
io.write(0 == false) // expect: false
|
||||
|
||||
io.write(123 != 123) // expect: false
|
||||
io.write(123 != 124) // expect: true
|
||||
io.write(-3 != 3) // expect: true
|
||||
|
||||
// Not equal to other types.
|
||||
io.write(123 != "123") // expect: true
|
||||
io.write(1 != true) // expect: true
|
||||
io.write(0 != false) // expect: true
|
||||
|
||||
// TODO(bob): Should 0 == -0?
|
||||
@@ -0,0 +1,19 @@
|
||||
io.write("" == "") // expect: true
|
||||
io.write("abcd" == "abcd") // expect: true
|
||||
io.write("abcd" == "d") // expect: false
|
||||
io.write("e" == "abcd") // expect: false
|
||||
io.write("" == "abcd") // expect: false
|
||||
|
||||
// Not equal to other types.
|
||||
io.write("1" == 1) // expect: false
|
||||
io.write("true" == true) // expect: false
|
||||
|
||||
io.write("" != "") // expect: false
|
||||
io.write("abcd" != "abcd") // expect: false
|
||||
io.write("abcd" != "d") // expect: true
|
||||
io.write("e" != "abcd") // expect: true
|
||||
io.write("" != "abcd") // expect: true
|
||||
|
||||
// Not equal to other types.
|
||||
io.write("1" != 1) // expect: true
|
||||
io.write("true" != true) // expect: true
|
||||
Reference in New Issue
Block a user