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:
Bob Nystrom
2013-11-05 17:57:57 +00:00
parent c466c60434
commit 8353c26596
7 changed files with 178 additions and 35 deletions
+2
View File
@@ -1 +1,3 @@
io.write({ 123 }.call) // expect: 123
// TODO(bob): Arguments.
+23
View File
@@ -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
+20
View File
@@ -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
+19
View File
@@ -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?
+19
View File
@@ -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