fix ⟨a‿b⟩←⟨1‿2⟩ and ⟨3‿0,2‿1‿2⟩⊏6‿5⥊↕30
This commit is contained in:
parent
6afd425f24
commit
f36eddb01c
@ -133,6 +133,7 @@ bool harr_canStore(B x) { return true; }
|
||||
|
||||
|
||||
NOINLINE void harr_pfree(B x, usz am) { // am - item after last written
|
||||
assert(v(x)->type==t_harr);
|
||||
B* p = harr_ptr(x);
|
||||
for (usz i = 0; i < am; i++) dec(p[i]);
|
||||
mm_free(v(x));
|
||||
|
||||
@ -54,6 +54,7 @@ u8 el_or(u8 a, u8 b) {
|
||||
|
||||
void mut_pfree(Mut* m, usz n) { // free the first n elements
|
||||
if (m->type==el_B) harr_pfree(tag(m->val,ARR_TAG), n);
|
||||
else mm_free((Value*) m->val);
|
||||
}
|
||||
|
||||
// expects x to be an array, each position must be written to precisely once
|
||||
|
||||
@ -286,6 +286,7 @@ B select_c2(B t, B w, B x) {
|
||||
return withFill(rb,xf);
|
||||
}
|
||||
base:
|
||||
dec(xf);
|
||||
return c2(rt_select, w, x);
|
||||
}
|
||||
|
||||
|
||||
15
src/vm.c
15
src/vm.c
@ -205,7 +205,7 @@ Block* compile(B bcq, B objs, B blocksq) { // consumes all
|
||||
return ret;
|
||||
}
|
||||
|
||||
void v_set(Scope* pscs[], B s, B x, bool upd) { // frees s, doesn't consume x
|
||||
void v_set(Scope* pscs[], B s, B x, bool upd) { // doesn't consume
|
||||
if (isVar(s)) {
|
||||
Scope* sc = pscs[(u16)(s.u>>32)];
|
||||
B prev = sc->vars[(u32)s.u];
|
||||
@ -218,14 +218,11 @@ void v_set(Scope* pscs[], B s, B x, bool upd) { // frees s, doesn't consume x
|
||||
sc->vars[(u32)s.u] = inc(x);
|
||||
} else {
|
||||
VT(s, t_harr);
|
||||
if (!eqShape(s, x)) thrM("Assignment: Mismatched shape for spread assignment");
|
||||
if (!isArr(x) || !eqShape(s, x)) thrM("Assignment: Mismatched shape for spread assignment");
|
||||
usz ia = a(x)->ia;
|
||||
B* sp = harr_ptr(s);
|
||||
BS2B xgetU = TI(x).getU;
|
||||
for (u64 i = 0; i < ia; i++) {
|
||||
v_set(pscs, sp[i], xgetU(x,i), upd);
|
||||
}
|
||||
dec(s);
|
||||
for (u64 i = 0; i < ia; i++) v_set(pscs, sp[i], xgetU(x,i), upd);
|
||||
}
|
||||
}
|
||||
B v_get(Scope* pscs[], B s) { // get value representing s, replacing with bi_optOut; doesn't consume
|
||||
@ -372,12 +369,12 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
|
||||
vars[p] = bi_optOut;
|
||||
break;
|
||||
}
|
||||
case SETN: { P(s) P(x) v_set(pscs, s, x, false); ADD(x); break; }
|
||||
case SETU: { P(s) P(x) v_set(pscs, s, x, true ); ADD(x); break; }
|
||||
case SETN: { P(s) P(x) v_set(pscs, s, x, false); dec(s); ADD(x); break; }
|
||||
case SETU: { P(s) P(x) v_set(pscs, s, x, true ); dec(s); ADD(x); break; }
|
||||
case SETM: { P(s)P(f)P(x)
|
||||
B w = v_get(pscs, s);
|
||||
B r = c2(f,w,x); dec(f);
|
||||
v_set(pscs, s, r, true);
|
||||
v_set(pscs, s, r, true); dec(s);
|
||||
ADD(r);
|
||||
break;
|
||||
}
|
||||
|
||||
16
test.bqn
16
test.bqn
@ -1,5 +1,5 @@
|
||||
#! /usr/bin/env dbqn
|
||||
"Usage: ./test.bqn path/to/mlochbaum/BQN [-sme] name | ./BQN"!2≤≠•args
|
||||
"Usage: ./test.bqn path/to/mlochbaum/BQN [-qsmev] name | ./BQN"!2≤≠•args
|
||||
path←⊑•args
|
||||
args←1↓•args
|
||||
opt←""
|
||||
@ -10,11 +10,15 @@ case←⊑args
|
||||
case∾↩".bqn"
|
||||
tests ← •FLines path∾"/test/cases/"∾case
|
||||
tests/˜↩ (('#'≢⊑)∧0<≠)¨tests
|
||||
{𝕊: tests/˜↩{"! %"≢3↑𝕩}¨tests}⍟⊑ 's'∊opt
|
||||
{𝕊: tests/˜↩{"! %"≡3↑𝕩}¨tests}⍟⊑ 'e'∊opt
|
||||
Out ← {•Out'%'⊸∊◶⊢‿{𝕩↓˜1+⊑𝕩⊐'%'}𝕩}
|
||||
{𝕊: tests/˜↩'!'≠⊑¨tests}⍟⊑ 's'∊opt
|
||||
{𝕊: tests/˜↩'!'=⊑¨tests}⍟⊑ 'e'∊opt
|
||||
Q ← {
|
||||
i←⊑𝕩⊐'%'
|
||||
(('!'≠⊑𝕩)∧⊑'v'∊opt)◶⟨(1+i)⊸↓ ⋄ {∾⟨"(" ⋄ i↑𝕩 ⋄ ") ≡ {" ⋄ (⊐⟜'#'⊑⊸↑⊢) (1+i)↓𝕩 ⋄ " }"⟩}⟩ 𝕩
|
||||
}
|
||||
Out ← {•Out'%'⊸∊◶⊢‿Q𝕩}
|
||||
|
||||
((⊑'m'∊opt)⊑Out‿{•Show𝕩⋄Out𝕩})¨tests
|
||||
# ('%'⊸∊∨ '#'= ·⊑ ∾⟜"#")◶•Out‿@¨tests
|
||||
•Out """finished"""
|
||||
•Out ""
|
||||
•Out⍟(¬⊑'q'∊opt) """finished"""
|
||||
•Out⍟(¬⊑'q'∊opt) ""
|
||||
Loading…
Reference in New Issue
Block a user