[PATCH 2/4] Reorder binary operations
[Thread Prev] | [Thread Next]
- Subject: [PATCH 2/4] Reorder binary operations
- From: "S. Gilles" <sgilles@xxxxxxxxxxxx>
- Reply-to: myrddin-dev@xxxxxxxxxxxxxx
- Date: Thu, 26 Oct 2017 21:06:43 -0400
- To: "myrddin-dev" <myrddin-dev@xxxxxxxxxxxxxx>
- Cc: "S. Gilles" <sgilles@xxxxxxxxxxxx>
The terminfo format goes out of its way to make binary operations
read left-to-right, see e.g. ncurses-6.0' tinfo/lib_tparm.c:652.
---
test/tifmt.myr | 12 +++++++++---
tifmt.myr | 27 ++++++++++++++++++++++-----
2 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/test/tifmt.myr b/test/tifmt.myr
index cd02fd5..0fd1dcf 100644
--- a/test/tifmt.myr
+++ b/test/tifmt.myr
@@ -30,10 +30,16 @@ const main = {
/* numeric */
[.name="arith-add", .fn={ctx; binop(ctx, 'd', '+', 10, 21, "31")}],
- [.name="arith-sub", .fn={ctx; binop(ctx, 'd', '-', 21, 10, "-11")}],
+ [.name="arith-sub", .fn={ctx; binop(ctx, 'd', '-', 10, 21, "-11")}],
[.name="arith-mul", .fn={ctx; binop(ctx, 'd', '*', 10, 21, "210")}],
- [.name="arith-div", .fn={ctx; binop(ctx, 'd', '/', 9, 100, "11")}],
- [.name="arith-mod", .fn={ctx; binop(ctx, 'd', 'm', 9, 100, "1")}],
+ [.name="arith-div", .fn={ctx; binop(ctx, 'd', '/', 100, 9, "11")}],
+ [.name="arith-mod", .fn={ctx; binop(ctx, 'd', 'm', 100, 9, "1")}],
+
+ /* comparison */
+ [.name="comp-lt-1", .fn={ctx; binop(ctx, 'd', '<', 0, 1, "1")}],
+ [.name="comp-lt-2", .fn={ctx; binop(ctx, 'd', '<', 0, 999, "1")}],
+ [.name="comp-lt-3", .fn={ctx; binop(ctx, 'd', '<', 2, -2, "0")}],
+ [.name="comp-gt-1", .fn={ctx; binop(ctx, 'd', '>', 156, 100, "1")}],
/* bitwise */
[.name="bit-and", .fn={ctx; binop(ctx, 'x','&', 0x60, 0xc0, "40")}],
diff --git a/tifmt.myr b/tifmt.myr
index 29f0831..4ae92b8 100644
--- a/tifmt.myr
+++ b/tifmt.myr
@@ -39,10 +39,27 @@ const eval = {f, sb, str
| 'l': pushi(f, pops(f).len)
/* arithmetic */
| '+': pushi(f, popi(f) + popi(f))
- | '-': pushi(f, popi(f) - popi(f))
+ | '-':
+ var b = popi(f)
+ var a = popi(f)
+ pushi(f, a - b)
| '*': pushi(f, popi(f) * popi(f))
- | '/': pushi(f, popi(f) / popi(f))
- | 'm': pushi(f, popi(f) % popi(f))
+ | '/':
+ var d = popi(f)
+ var n = popi(f)
+ if d == 0
+ pushi(f, 0)
+ else
+ pushi(f, n / d)
+ ;;
+ | 'm':
+ var m = popi(f)
+ var n = popi(f)
+ if m == 0
+ pushi(f, 0)
+ else
+ pushi(f, n % m)
+ ;;
/* bitwise */
| '&': pushi(f, popi(f) & popi(f))
| '|': pushi(f, popi(f) | popi(f))
@@ -50,8 +67,8 @@ const eval = {f, sb, str
| '~': pushi(f, ~ popi(f))
/* relational false*/
| '=': pushi(f, btoi(popi(f) == popi(f)))
- | '<': pushi(f, btoi(popi(f) < popi(f)))
- | '>': pushi(f, btoi(popi(f) > popi(f)))
+ | '<': pushi(f, btoi(popi(f) > popi(f)))
+ | '>': pushi(f, btoi(popi(f) < popi(f)))
/* logical */
| 'A': pushi(f, btoi(popi(f) != 0 && popi(f) != 0))
| 'O': pushi(f, btoi(popi(f) != 0 || popi(f) != 0))
--
2.14.3
| [PATCH 0/4] Fixes to allow using terminfo for colors on st | "S. Gilles" <sgilles@xxxxxxxxxxxx> |
- Prev by Date: [PATCH 1/4] Allow litint with nontrivial start
- Next by Date: [PATCH 3/4] Allow multi-arm conditionals
- Previous by thread: [PATCH 1/4] Allow litint with nontrivial start
- Next by thread: [PATCH 3/4] Allow multi-arm conditionals
- Index(es):