From: NeilBrown Date: Mon, 20 Dec 2021 20:34:06 +0000 (+1100) Subject: oceani: remove "and then" and "or else" X-Git-Url: https://ocean-lang.org/code/?p=ocean;a=commitdiff_plain;h=37c2482809a970e5c452f4e3f43d9ee8e18fd141 oceani: remove "and then" and "or else" I can't think of any reason that "and" and "or" shouldn't be short-circuit operators, so change them to do what "and then" and "or else" currently do, and discard the latter. Signed-off-by: NeilBrown --- diff --git a/csrc/oceani-tests.mdc b/csrc/oceani-tests.mdc index 6759c54..0feb0d2 100644 --- a/csrc/oceani-tests.mdc +++ b/csrc/oceani-tests.mdc @@ -274,12 +274,12 @@ Now we need to test if/else and some different loops print "error is ", target - guess * guess for j:=0; then j = j+3 ; while j < 10: - if j != 0 and then 20 / j > 3: + if j != 0 and 20 / j > 3: print "20 /", j," =", 20 / j else print "I won't calculate 20 /", j pi ::= 3.1415926535897 - if 355/113 == pi or else +(pi - 355/113) < 0.001: + if 355/113 == pi or +(pi - 355/113) < 0.001: print "Close enough" print "lower" if 355/113 < pi else "higher" print "higher" if 355/113 > pi else "lower" @@ -781,7 +781,7 @@ A simple linked list example func insert(list:@linkage; new:string) p:=list - while ?p.next and then p.next.this < new: + while ?p.next and p.next.this < new: p = p.next.list t:@node = @new() t.list.next = p.next diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 910d095..d40a548 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -37,9 +37,9 @@ boolean operators. Some operators that have only recently been added, and so have not generated all that much experience yet are "and then" and "or else" as -short-circuit Boolean operators, and the "if ... else" trinary -operator which can select between two expressions based on a third -(which appears syntactically in the middle). +short-circuit Boolean operators (which have since been remove), and the +"if ... else" trinary operator which can select between two expressions +based on a third (which appears syntactically in the middle). The "func" clause currently only allows a "main" function to be declared. That will be extended when proper function support is added. @@ -3932,15 +3932,12 @@ lists. In that case a separate function is used to print them. ### Expressions: Boolean The next class of expressions to use the `binode` will be Boolean -expressions. "`and then`" and "`or else`" are similar to `and` and `or` -have same corresponding precendence. The difference is that they don't +expressions. `and` and `or` are short-circuit operators that don't evaluate the second expression if not necessary. ###### Binode types And, - AndThen, Or, - OrElse, Not, ###### declare terminals @@ -3956,14 +3953,6 @@ evaluate the second expression if not necessary. b->right = $<3; $0 = b; } }$ - | Expression or else Expression ${ { - struct binode *b = new(binode); - b->op = OrElse; - b->left = $<1; - b->right = $<4; - $0 = b; - } }$ - | Expression and Expression ${ { struct binode *b = new(binode); b->op = And; @@ -3971,14 +3960,6 @@ evaluate the second expression if not necessary. b->right = $<3; $0 = b; } }$ - | Expression and then Expression ${ { - struct binode *b = new(binode); - b->op = AndThen; - b->left = $<1; - b->right = $<4; - $0 = b; - } }$ - | not Expression ${ { struct binode *b = new(binode); b->op = Not; @@ -3994,13 +3975,6 @@ evaluate the second expression if not necessary. print_exec(b->right, -1, bracket); if (bracket) printf(")"); break; - case AndThen: - if (bracket) printf("("); - print_exec(b->left, -1, bracket); - printf(" and then "); - print_exec(b->right, -1, bracket); - if (bracket) printf(")"); - break; case Or: if (bracket) printf("("); print_exec(b->left, -1, bracket); @@ -4008,13 +3982,6 @@ evaluate the second expression if not necessary. print_exec(b->right, -1, bracket); if (bracket) printf(")"); break; - case OrElse: - if (bracket) printf("("); - print_exec(b->left, -1, bracket); - printf(" or else "); - print_exec(b->right, -1, bracket); - if (bracket) printf(")"); - break; case Not: if (bracket) printf("("); printf("not "); @@ -4024,9 +3991,7 @@ evaluate the second expression if not necessary. ###### propagate binode cases case And: - case AndThen: case Or: - case OrElse: case Not: /* both must be Tbool, result is Tbool */ propagate_types(b->left, c, perr, Tbool, 0); @@ -4039,21 +4004,11 @@ evaluate the second expression if not necessary. ###### interp binode cases case And: - rv = interp_exec(c, b->left, &rvtype); - right = interp_exec(c, b->right, &rtype); - rv.bool = rv.bool && right.bool; - break; - case AndThen: rv = interp_exec(c, b->left, &rvtype); if (rv.bool) rv = interp_exec(c, b->right, NULL); break; case Or: - rv = interp_exec(c, b->left, &rvtype); - right = interp_exec(c, b->right, &rtype); - rv.bool = rv.bool || right.bool; - break; - case OrElse: rv = interp_exec(c, b->left, &rvtype); if (!rv.bool) rv = interp_exec(c, b->right, NULL); @@ -5998,7 +5953,7 @@ things which will likely grow as the languages grows. a : number a = A; b:number = B - if a > 0 and then b > 0: + if a > 0 and b > 0: while a != b: if a < b: b = b - a