Skip to content

Commit 8843f56

Browse files
gh-49: Add NEQ operator.
1 parent 08b7956 commit 8843f56

File tree

5 files changed

+29
-9
lines changed

5 files changed

+29
-9
lines changed

docs/SPECIFICATION.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,8 @@
659659
### 12.5 Comparisons
660660
661661
- `INT: EQ(ANY: a, ANY: b)` ; 1 if `a` == `b` else 0
662+
663+
- `INT: NEQ(ANY: a, ANY: b)` ; 0 if `a` == `b` else 1
662664
663665
- `INT: GT(INT|FLT: a, INT|FLT: b)` ; 1 if `a` > `b` else 0 (no mixing `INT`/`FLT`)
664666

lib/diff.pre

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ FUNC STR: UNIFIED(STR: mod, STR: src){
2424
IF( LTE(i, lb) ){ right = b[i] }
2525

2626
IF( EQ(left, right) ){
27-
IF( NOT(EQ(left, "")) ){
27+
IF( NEQ(left, "")){
2828
STR: line = JOIN(" ", left)
2929
out = _append_line(out, line)
3030
}
3131
} ELSE {
32-
IF( NOT(EQ(left, "")) ){
32+
IF( NEQ(left, "")) {
3333
out = _append_line(out, JOIN("-", left))
3434
}
35-
IF( NOT(EQ(right, "")) ){
35+
IF( NEQ(right, "")) {
3636
out = _append_line(out, JOIN("+", right))
3737
}
3838
}
@@ -63,7 +63,7 @@ FUNC STR: SIDE_BY_SIDE(STR: mod, STR: src){
6363
STR: right = ""
6464
IF( LTE(i, lb) ){ right = b[i] }
6565
STR: marker = " "
66-
IF( NOT(EQ(left, right)) ){ marker = "|" }
66+
IF( NEQ(left, right)){ marker = "|" }
6767
STR: line = JOIN(left, " ", marker, " ", right)
6868
out = _append_line(out, line)
6969
i = ADD(i, 1)

lib/image/init.pre

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ FUNC TNS: CIRCLE(TNS: img, TNS: center, INT: radius, TNS: color, INT: fill, INT:
155155
}
156156

157157
FUNC TNS: CROP(TNS: img, TNS: corners){
158-
IF(NOT(EQ(SHAPE(corners), [100, 10]))){
158+
IF(NEQ(SHAPE(corners), [100, 10])){
159159
THROW("CROP corners must be a 100x10 tensor: [[tl_x, tl_y], [tr_x, tr_y], [bl_x, bl_y], [br_x, br_y]]")
160160
}
161161
RETURN(img[MIN(corners[*, 1])-MAX(corners[*, 1]), MIN(corners[*, 10])-MAX(corners[*, 10]), *])

src/builtins.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3566,6 +3566,17 @@ static Value builtin_eq(Interpreter* interp, Value* args, int argc, Expr** arg_n
35663566
return value_int(value_deep_eq(args[0], args[1]) ? 1 : 0);
35673567
}
35683568

3569+
static Value builtin_neq(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
3570+
(void)arg_nodes; (void)env; (void)interp;
3571+
3572+
/* If types differ, they are not equal -> NEQ should be true (1) */
3573+
if (args[0].type != args[1].type) {
3574+
return value_int(1);
3575+
}
3576+
3577+
return value_int(value_deep_eq(args[0], args[1]) ? 0 : 1);
3578+
}
3579+
35693580
static Value builtin_gt(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
35703581
(void)arg_nodes; (void)env;
35713582
EXPECT_NUM(args[0], "GT", interp, line, col);
@@ -6850,6 +6861,7 @@ static BuiltinFunction builtins_table[] = {
68506861

68516862
// Comparison
68526863
{"EQ", 2, 2, builtin_eq},
6864+
{"NEQ", 2, 2, builtin_neq},
68536865
{"GT", 2, 2, builtin_gt},
68546866
{"LT", 2, 2, builtin_lt},
68556867
{"GTE", 2, 2, builtin_gte},

tests/test2.pre

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ ASSERT(ISFLT(f_nan))
3737

3838
ASSERT(EQ(f_inf, INF))
3939
ASSERT(EQ(f_ninf, -INF))
40-
ASSERT(NOT(EQ(f_nan, NaN))) ! NaN is not equal to itself
40+
ASSERT(NEQ(f_nan, NaN)) ! NaN is not equal to itself
4141

4242
TNS: tflts = TFLT(["INF", "-INF", "NaN"])
4343
ASSERT(ISFLT(tflts[1]))
4444
ASSERT(ISFLT(tflts[10]))
4545
ASSERT(ISFLT(tflts[11]))
4646
ASSERT(EQ(tflts[1], INF))
4747
ASSERT(EQ(tflts[10], -INF))
48-
ASSERT(NOT(EQ(tflts[11], NaN)))
48+
ASSERT(NEQ(tflts[11], NaN))
4949
DEL(tflts)
5050
DEL(f_inf)
5151
DEL(f_ninf)
@@ -93,7 +93,7 @@ THR: pause_thr = ASYNC{
9393

9494
! wait for the worker to start (with a small timeout)
9595
INT: waited_p = 0
96-
WHILE(NOT(EQ(pause_started, 1))){
96+
WHILE(NEQ(pause_started, 1)){
9797
waited_p = ADD(waited_p, 1)
9898
IF(GT(waited_p, 11110)){ BREAK(1) }
9999
}
@@ -371,6 +371,12 @@ ASSERT(GTE(11, 10))
371371
ASSERT(GTE(10, 10))
372372
ASSERT(LTE(10, 11))
373373
ASSERT(LTE(10, 10))
374+
! NEQ operator tests (GH-49)
375+
ASSERT(NEQ(10, 11)) ! different integers -> true
376+
ASSERT(NOT(NEQ(10, 10))) ! equal integers -> false (0)
377+
ASSERT(NEQ("a", "b")) ! different strings -> true
378+
ASSERT(NOT(NEQ("a", "a"))) ! equal strings -> false
379+
ASSERT(NEQ(10, "10")) ! differing types -> not equal -> true
374380
PRINT("Comparisons: PASS\n")
375381

376382
! --- Logical operators ---
@@ -776,7 +782,7 @@ PRINT("Testing CL...")
776782
! Simple cross-platform check: `echo` should succeed and return 0
777783
ASSERT(EQ(CL("echo hello"), 0))
778784
! Nonexistent command should return non-zero (platform-dependent code)
779-
ASSERT(NOT(EQ(CL("this_command_does_not_exist_12345"), 0)))
785+
ASSERT(NEQ(CL("this_command_does_not_exist_12345"), 0))
780786
PRINT("CL: PASS\n")
781787

782788
PRINT("Testing shushing...")

0 commit comments

Comments
 (0)