From 8e47221c9f417643e1ab689f4f8ae1a2eef673c8 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sun, 2 Jun 2024 20:28:58 -0400 Subject: [PATCH] =?UTF-8?q?Implement=20monadic=20boolean=20=3D`=20with=20?= =?UTF-8?q?=E2=89=A0`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/scan.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/builtins/scan.c b/src/builtins/scan.c index c0e78ff4..aa64ea93 100644 --- a/src/builtins/scan.c +++ b/src/builtins/scan.c @@ -35,6 +35,12 @@ B scan_ne(B x, u64 p, u64 ia) { // consumes x #endif decG(x); return r; } +B scan_eq(B x, u64 ia) { // consumes x + B r = scan_ne(x, 0, ia); + u64* rp = bitarr_ptr(r); + for (usz i = 0; i < BIT_N(ia); i++) rp[i] ^= 0xAAAAAAAAAAAAAAAA; + return r; +} static B scan_or(B x, u64 ia) { // consumes x u64* xp = bitarr_ptr(x); @@ -209,6 +215,7 @@ B scan_c1(Md1D* d, B x) { B f = d->f; if (rtid==n_or | rtid==n_ceil ) return scan_or(x, ia); // ∨⌈ if (rtid==n_and | rtid==n_mul | rtid==n_floor) return scan_and(x, ia); // ∧×⌊ if (rtid==n_ne ) return scan_ne(x, 0, ia); // ≠ + if (rtid==n_eq ) return scan_eq(x, ia); // = if (rtid==n_lt) return scan_lt(x, 0, ia); // < goto base; } @@ -335,14 +342,15 @@ B scan_rows_bit(Md1D* fd, B x) { #if SINGELI if (!v(fd->f)->flags) return bi_N; u8 rtid = v(fd->f)->flags-1; - if (rtid==n_and|rtid==n_or|rtid==n_ne) { + if (rtid==n_and|rtid==n_or|rtid==n_ne|rtid==n_eq) { + if (rtid==n_eq) x = bit_negate(x); usz *sh = SH(x); usz n = sh[0]; usz m = sh[1]; u64* xp = bitarr_ptr(x); u64* rp; B r = m_bitarrc(&rp, x); if (rtid==n_and) si_scan_rows_and(xp, rp, n, m); else if (rtid==n_or ) si_scan_rows_or (xp, rp, n, m); else si_scan_rows_ne (xp, rp, n, m); - decG(x); return r; + decG(x); return rtid==n_eq ? bit_negate(r) : r; } if (rtid==n_add && SH(x)[1]<128) { usz ia = IA(x); usz m = SH(x)[1];