From dd8e8b970b19f2c7eeb79e13eb2ef080fcac7a18 Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 6 Apr 2021 13:25:19 +0300 Subject: [PATCH] pass derived function to modifiers --- cc.bqn | 12 +++++------ src/derv.c | 62 +++++++++++++++++++++++++++--------------------------- src/h.h | 14 +++++++----- src/main.c | 2 +- src/md1.c | 8 +++---- src/md2.c | 8 +++---- src/vm.c | 12 +++++------ 7 files changed, 61 insertions(+), 57 deletions(-) diff --git a/cc.bqn b/cc.bqn index 4bb30df5..00096c71 100755 --- a/cc.bqn +++ b/cc.bqn @@ -9,14 +9,14 @@ L ← {"m_caB(" ∾(⍕≠𝕩)∾",(B[]){" ∾(1↓∾","⊸∾¨𝕩)∾"}) LI ← {"m_cai32("∾(⍕≠𝕩)∾",(i32[]){"∾(1↓∾","⊸∾¨𝕩)∾"})"} # Escape the special characters that appear in BQN sources. Esc←{ - in ← (@+0‿9‿10‿13)∾"'""" # Null, Tab, LF, CR, and quotes - out ← "0tnr" # Whitespace characters changed to letters + in ← (@+0‿9‿10‿13)∾"'""" # Null, Tab, LF, CR, and quotes + out ← "0tnr" # Whitespace characters changed to letters i ← in⊐𝕩 - 𝕩 ↩ i ⊏⟜out⌾((i<≠out)⊸/) 𝕩 # Replace - ∾(i<≠in) /⟜"\"⊸∾¨ 𝕩 # Insert \ + 𝕩 ↩ i ⊏⟜out⌾((i<≠out)⊸/) 𝕩 # Replace + ∾(i<≠in) /⟜"\"⊸∾¨ 𝕩 # Insert \ } -Str ← "m_str32(U"""∾Esc∾""")"˜ # A BQN string -Char ← {"m_c32(U'"∾(Esc⥊𝕩)∾"')"} # A BQN character +Str ← "m_str32(U"""∾Esc∾""")"˙ # A BQN string +Char ← {"m_c32(U'"∾(Esc⥊𝕩)∾"')"} # A BQN character Num ← {s←"-"/˜𝕩<0 ⋄ ∞⊸=∘|◶⟨"m_f64("∾")"∾˜s∾⍕∘| ⋄ "m_f64("∾s∾"1.0/0.0)"⟩𝕩} # Format number F ← ⍕ # Format number diff --git a/src/derv.c b/src/derv.c index 24491891..16908275 100644 --- a/src/derv.c +++ b/src/derv.c @@ -2,17 +2,17 @@ typedef struct Md1D { // F _md struct Fun; - B m; // known to be Md1 at creation; kept as type B as refc-- might want to know tagged ptr info + B m1; B f; } Md1D; typedef struct Md2D { // F _md_ G struct Fun; - B m; + B m2; B f, g; } Md2D; typedef struct Md2H { // _md_ G struct Md1; - B m; + B m2; B g; } Md2H; typedef struct Fork { @@ -24,41 +24,41 @@ typedef struct Atop { B g, h; } Atop; -void md1D_free(B x) { dec(c(Md1D,x)->m); dec(c(Md1D,x)->f); } -void md2D_free(B x) { dec(c(Md2D,x)->m); dec(c(Md2D,x)->f); dec(c(Md2D,x)->g); } -void md2H_free(B x) { dec(c(Md2H,x)->m); dec(c(Md2H,x)->g); } -void fork_free(B x) { dec(c(Fork,x)->f); dec(c(Fork,x)->g); dec(c(Fork,x)->h); } -void atop_free(B x) { dec(c(Atop,x)->g); dec(c(Atop,x)->h); } +void md1D_free(B x) { dec(c(Md1D,x)->m1); dec(c(Md1D,x)->f); } +void md2D_free(B x) { dec(c(Md2D,x)->m2); dec(c(Md2D,x)->f); dec(c(Md2D,x)->g); } +void md2H_free(B x) { dec(c(Md2H,x)->m2); dec(c(Md2H,x)->g); } +void fork_free(B x) { dec(c(Fork,x)->f ); dec(c(Fork,x)->g); dec(c(Fork,x)->h); } +void atop_free(B x) { dec(c(Atop,x)->g); dec(c(Atop,x)->h); } -void md1D_print(B x) { printf("(md1D ");print(c(Md1D,x)->f);printf(" ");print(c(Md1D,x)->m); printf(")"); } -void md2D_print(B x) { printf("(md2D ");print(c(Md2D,x)->f);printf(" ");print(c(Md2D,x)->m);printf(" ");print(c(Md2D,x)->g);printf(")"); } -void md2H_print(B x) { printf("(md2H "); print(c(Md2H,x)->m);printf(" ");print(c(Md2H,x)->g);printf(")"); } -void fork_print(B x) { printf("(fork ");print(c(Fork,x)->f);printf(" ");print(c(Fork,x)->g);printf(" ");print(c(Fork,x)->h);printf(")"); } -void atop_print(B x) { printf("(atop "); print(c(Atop,x)->g);printf(" ");print(c(Atop,x)->h);printf(")"); } +void md1D_print(B x) { printf("(md1D ");print(c(Md1D,x)->f);printf(" ");print(c(Md1D,x)->m1); printf(")"); } +void md2D_print(B x) { printf("(md2D ");print(c(Md2D,x)->f);printf(" ");print(c(Md2D,x)->m2);printf(" ");print(c(Md2D,x)->g);printf(")"); } +void md2H_print(B x) { printf("(md2H "); print(c(Md2H,x)->m2);printf(" ");print(c(Md2H,x)->g);printf(")"); } +void fork_print(B x) { printf("(fork ");print(c(Fork,x)->f);printf(" ");print(c(Fork,x)->g );printf(" ");print(c(Fork,x)->h);printf(")"); } +void atop_print(B x) { printf("(atop "); print(c(Atop,x)->g );printf(" ");print(c(Atop,x)->h);printf(")"); } -B md1D_c1(B t , B x) { return c(Md1,c(Md1D, t)->m)->c1(c(Md1D, t)->m, c(Md1D, t)->f, x); } -B md1D_c2(B t, B w, B x) { return c(Md1,c(Md1D, t)->m)->c2(c(Md1D, t)->m, c(Md1D, t)->f, w, x); } -B md2D_c1(B t , B x) { return c(Md2,c(Md2D, t)->m)->c1(c(Md2D, t)->m, c(Md2D, t)->f, c(Md2D, t)->g, x); } -B md2D_c2(B t, B w, B x) { return c(Md2,c(Md2D, t)->m)->c2(c(Md2D, t)->m, c(Md2D, t)->f, c(Md2D, t)->g, w, x); } -B atop_c1(B t , B x) { return c1(c(Atop,t)->g, c1(c(Atop,t)->h, x)); } +B md1D_c1(B t, B x) { return c(Md1,c(Md1D, t)->m1)->c1(t, x); } +B md1D_c2(B t, B w, B x) { return c(Md1,c(Md1D, t)->m1)->c2(t, w, x); } +B md2D_c1(B t, B x) { return c(Md2,c(Md2D, t)->m2)->c1(t, x); } +B md2D_c2(B t, B w, B x) { return c(Md2,c(Md2D, t)->m2)->c2(t, w, x); } +B atop_c1(B t, B x) { return c1(c(Atop,t)->g, c1(c(Atop,t)->h, x)); } B atop_c2(B t, B w, B x) { return c1(c(Atop,t)->g, c2(c(Atop,t)->h, w, x)); } -B fork_c1(B t , B x) { B g=c1(c(Fork,t)->h, inci(x)); return c2(c(Fork,t)->g, c1(c(Fork,t)->f, x), g); } +B fork_c1(B t, B x) { B g=c1(c(Fork,t)->h, inci(x)); return c2(c(Fork,t)->g, c1(c(Fork,t)->f, x), g); } B fork_c2(B t, B w, B x) { B g=c2(c(Fork,t)->h, inci(w), inci(x)); return c2(c(Fork,t)->g, c2(c(Fork,t)->f, w, x), g); } -B md2H_c1(B t, B f , B x) { return c(Md2,c(Md2H, t)->m)->c1(c(Md2H,t)->m, f, c(Md2H,t)->g, x); } -B md2H_c2(B t, B f, B w, B x) { return c(Md2,c(Md2H, t)->m)->c2(c(Md2H,t)->m, f, c(Md2H,t)->g, w, x); } +B md2H_c1(B d, B x) { Md1D* m=c(Md1D,d); Md2H* t=c(Md2H,m->m1); return md2D_c1(m_md2D(t->m2, m->f, t->g), x); } +B md2H_c2(B d, B w, B x) { Md1D* m=c(Md1D,d); Md2H* t=c(Md2H,m->m1); return md2D_c2(m_md2D(t->m2, m->f, t->g), w, x); } -B md1D_decompose(B x) { B r=m_v3(m_i32(4),inci(c(Md1D,x)->f),inci(c(Md1D,x)->m) ); dec(x); return r; } -B md2D_decompose(B x) { B r=m_v4(m_i32(5),inci(c(Md2D,x)->f),inci(c(Md2D,x)->m), inci(c(Md2D,x)->g)); dec(x); return r; } -B md2H_decompose(B x) { B r=m_v3(m_i32(6), inci(c(Md2H,x)->m), inci(c(Md2H,x)->g)); dec(x); return r; } -B fork_decompose(B x) { B r=m_v4(m_i32(3),inci(c(Fork,x)->f),inci(c(Fork,x)->g), inci(c(Fork,x)->h)); dec(x); return r; } -B atop_decompose(B x) { B r=m_v3(m_i32(2), inci(c(Atop,x)->g), inci(c(Atop,x)->h)); dec(x); return r; } +B md1D_decompose(B x) { B r=m_v3(m_i32(4),inci(c(Md1D,x)->f),inci(c(Md1D,x)->m1) ); dec(x); return r; } +B md2D_decompose(B x) { B r=m_v4(m_i32(5),inci(c(Md2D,x)->f),inci(c(Md2D,x)->m2), inci(c(Md2D,x)->g)); dec(x); return r; } +B md2H_decompose(B x) { B r=m_v3(m_i32(6), inci(c(Md2H,x)->m2), inci(c(Md2H,x)->g)); dec(x); return r; } +B fork_decompose(B x) { B r=m_v4(m_i32(3),inci(c(Fork,x)->f),inci(c(Fork,x)->g ), inci(c(Fork,x)->h)); dec(x); return r; } +B atop_decompose(B x) { B r=m_v3(m_i32(2), inci(c(Atop,x)->g ), inci(c(Atop,x)->h)); dec(x); return r; } // consume all args -B m_md1D(B m, B f ) { B r = mm_alloc(sizeof(Md1D), t_md1D, ftag(FUN_TAG)); c(Md1D,r)->f = f; c(Md1D,r)->m = m; c(Md1D,r)->c1=md1D_c1; c(Md1D,r)->c2=md1D_c2; c(Md1D,r)->extra=pf_md1d; return r; } -B m_md2D(B m, B f, B g) { B r = mm_alloc(sizeof(Md2D), t_md2D, ftag(FUN_TAG)); c(Md2D,r)->f = f; c(Md2D,r)->m = m; c(Md2D,r)->g = g; c(Md2D,r)->c1=md2D_c1; c(Md2D,r)->c2=md2D_c2; c(Md2D,r)->extra=pf_md2d; return r; } -B m_md2H(B m, B g) { B r = mm_alloc(sizeof(Md2H), t_md2H, ftag(MD1_TAG)); c(Md2H,r)->m = m; c(Md2H,r)->g = g; c(Md2H,r)->c1=md2H_c1; c(Md2H,r)->c2=md2H_c2; return r; } -B m_fork(B f, B g, B h) { B r = mm_alloc(sizeof(Fork), t_fork, ftag(FUN_TAG)); c(Fork,r)->f = f; c(Fork,r)->g = g; c(Fork,r)->h = h; c(Fork,r)->c1=fork_c1; c(Fork,r)->c2=fork_c2; c(Fork,r)->extra=pf_fork; return r; } -B m_atop( B g, B h) { B r = mm_alloc(sizeof(Atop), t_atop, ftag(FUN_TAG)); c(Atop,r)->g = g; c(Atop,r)->h = h; c(Atop,r)->c1=atop_c1; c(Atop,r)->c2=atop_c2; c(Atop,r)->extra=pf_atop; return r; } +B m_md1D(B m, B f ) { B r = mm_alloc(sizeof(Md1D), t_md1D, ftag(FUN_TAG)); c(Md1D,r)->f = f; c(Md1D,r)->m1 = m; c(Md1D,r)->c1=md1D_c1; c(Md1D,r)->c2=md1D_c2; c(Md1D,r)->extra=pf_md1d; return r; } +B m_md2D(B m, B f, B g) { B r = mm_alloc(sizeof(Md2D), t_md2D, ftag(FUN_TAG)); c(Md2D,r)->f = f; c(Md2D,r)->m2 = m; c(Md2D,r)->g = g; c(Md2D,r)->c1=md2D_c1; c(Md2D,r)->c2=md2D_c2; c(Md2D,r)->extra=pf_md2d; return r; } +B m_md2H(B m, B g) { B r = mm_alloc(sizeof(Md2H), t_md2H, ftag(MD1_TAG)); c(Md2H,r)->m2 = m; c(Md2H,r)->g = g; c(Md2H,r)->c1=md2H_c1; c(Md2H,r)->c2=md2H_c2; return r; } +B m_fork(B f, B g, B h) { B r = mm_alloc(sizeof(Fork), t_fork, ftag(FUN_TAG)); c(Fork,r)->f = f; c(Fork,r)->g = g; c(Fork,r)->h = h; c(Fork,r)->c1=fork_c1; c(Fork,r)->c2=fork_c2; c(Fork,r)->extra=pf_fork; return r; } +B m_atop( B g, B h) { B r = mm_alloc(sizeof(Atop), t_atop, ftag(FUN_TAG)); c(Atop,r)->g = g; c(Atop,r)->h = h; c(Atop,r)->c1=atop_c1; c(Atop,r)->c2=atop_c2; c(Atop,r)->extra=pf_atop; return r; } // consume all args B m1_d(B m, B f ) { if(isMd1(m)) return TI(m).m1_d(m, f ); return err("Interpreting non-1-modifier as 1-modifier"); } diff --git a/src/h.h b/src/h.h index 84ad1320..439c5c34 100644 --- a/src/h.h +++ b/src/h.h @@ -403,15 +403,19 @@ B c2(B f, B w, B x) { // BQN-call f dyadically; consumes w,x typedef struct Md1 { struct Value; - BBB2B c1; // f(m,f, x); consumes x - BBBB2B c2; // f(m,f,w,x); consumes w,x + BB2B c1; // f(md1d{this,f}, x); consumes x + BBB2B c2; // f(md1d{this,f},w,x); consumes w,x } Md1; typedef struct Md2 { struct Value; - BBBB2B c1; // f(m,f,g, x); consumes x - BBBBB2B c2; // f(m,f,g,w,x); consumes w,x + BB2B c1; // f(md2d{this,f,g}, x); consumes x + BBB2B c2; // f(md2d{this,f,g},w,x); consumes w,x } Md2; - +B m_md1D(B m, B f ); +B m_md2D(B m, B f, B g); +B m_md2H(B m, B g); +B m_fork(B f, B g, B h); +B m_atop( B g, B h); void arr_print(B x) { usz r = rnk(x); diff --git a/src/main.c b/src/main.c index b5bdb11e..f07acdbb 100644 --- a/src/main.c +++ b/src/main.c @@ -14,12 +14,12 @@ #include "i32arr.c" #include "c32arr.c" #include "utf.c" +#include "derv.c" #include "arith.c" #include "sfns.c" #include "md1.c" #include "md2.c" #include "sysfn.c" -#include "derv.c" #include "vm.c" void pr(char* a, B b) { diff --git a/src/md1.c b/src/md1.c index 455a6604..687b0185 100644 --- a/src/md1.c +++ b/src/md1.c @@ -1,6 +1,6 @@ #include "h.h" -B tbl_c1(B t, B f, B x) { +B tbl_c1(B d, B x) { B f = c(Md1D,d)->f; if (!isArr(x)) return err("⌜: argument was atom"); usz ia = a(x)->ia; if (v(x)->type==t_harr && reusable(x)) { @@ -14,7 +14,7 @@ B tbl_c1(B t, B f, B x) { dec(x); return r.b; } -B tbl_c2(B t, B f, B w, B x) { +B tbl_c2(B d, B w, B x) { B f = c(Md1D,d)->f; if (isArr(w) & isArr(x)) { usz wia = a(w)->ia; ur wr = rnk(w); usz xia = a(x)->ia; ur xr = rnk(x); @@ -43,7 +43,7 @@ B tbl_c2(B t, B f, B w, B x) { } -B scan_c1(B t, B f, B x) { +B scan_c1(B d, B x) { B f = c(Md1D,d)->f; if (!isArr(x)) return err("`: argument cannot be a scalar"); ur xr = rnk(x); if (xr==0) return err("`: argument cannot be a scalar"); @@ -62,7 +62,7 @@ B scan_c1(B t, B f, B x) { dec(x); return r.b; } -B scan_c2(B t, B f, B w, B x) { +B scan_c2(B d, B w, B x) { B f = c(Md1D,d)->f; if (!isArr(x)) return err("`: 𝕩 cannot be a scalar"); ur xr = rnk(x); usz* xsh = a(x)->sh; BS2B xget = TI(x).get; HArr_p r = (v(x)->type==t_harr && reusable(x))? harr_parts(inci(x)) : m_harrc(x); diff --git a/src/md2.c b/src/md2.c index 2395e7f7..1fcd3577 100644 --- a/src/md2.c +++ b/src/md2.c @@ -2,11 +2,11 @@ -B val_c1(B t, B f, B g, B x) { return c1(f, x); } -B val_c2(B t, B f, B g, B w, B x) { return c2(g,w,x); } +B val_c1(B d, B x) { return c1(c(Md2D,d)->f, x); } +B val_c2(B d, B w, B x) { return c2(c(Md2D,d)->g, w,x); } -B fillBy_c1(B t, B f, B g, B x) { return c1(f, x); } -B fillBy_c2(B t, B f, B g, B w, B x) { return c2(f,w,x); } +B fillBy_c1(B d, B x) { return c1(c(Md2D,d)->f, x); } +B fillBy_c2(B d, B w, B x) { return c2(c(Md2D,d)->f, w,x); } #define ba(NAME) bi_##NAME = mm_alloc(sizeof(Md2), t_md2_def, ftag(MD2_TAG)); c(Md2,bi_##NAME)->c2 = NAME##_c2; c(Md2,bi_##NAME)->c1 = NAME##_c1; #define bd(NAME) bi_##NAME = mm_alloc(sizeof(Md2), t_md2_def, ftag(MD2_TAG)); c(Md2,bi_##NAME)->c2 = NAME##_c2; c(Md2,bi_##NAME)->c1 = c1_invalid; diff --git a/src/vm.c b/src/vm.c index 15addc33..73e1e6df 100644 --- a/src/vm.c +++ b/src/vm.c @@ -403,12 +403,12 @@ B actualExec(Block* bl, Scope* psc, u32 ga, B* svar) { return r; } -B funBl_c1(B t, B x) { return actualExec(c(FunBlock, t)->bl, c(FunBlock, t)->sc, 3, (B[]){inci(t), x, bi_nothing }); } -B funBl_c2(B t, B w, B x) { return actualExec(c(FunBlock, t)->bl, c(FunBlock, t)->sc, 3, (B[]){inci(t), x, w }); } -B md1Bl_c1(B t, B f, B x) { return actualExec(c(Md1Block, t)->bl, c(Md1Block, t)->sc, 5, (B[]){m_md1D(inci(t),inci(f) ), x, bi_nothing, inci(t), inci(f) }); } -B md1Bl_c2(B t, B f, B w, B x) { return actualExec(c(Md1Block, t)->bl, c(Md1Block, t)->sc, 5, (B[]){m_md1D(inci(t),inci(f) ), x, w , inci(t), inci(f) }); } -B md2Bl_c1(B t, B f, B g, B x) { return actualExec(c(Md2Block, t)->bl, c(Md2Block, t)->sc, 6, (B[]){m_md2D(inci(t),inci(f),inci(g)), x, bi_nothing, inci(t), inci(f), inci(g)}); } -B md2Bl_c2(B t, B f, B g, B w, B x) { return actualExec(c(Md2Block, t)->bl, c(Md2Block, t)->sc, 6, (B[]){m_md2D(inci(t),inci(f),inci(g)), x, w , inci(t), inci(f), inci(g)}); } +B funBl_c1(B t, B x) { FunBlock* b=c(FunBlock, t ); return actualExec(b->bl, b->sc, 3, (B[]){inci(t), x, bi_nothing }); } +B funBl_c2(B t, B w, B x) { FunBlock* b=c(FunBlock, t ); return actualExec(b->bl, b->sc, 3, (B[]){inci(t), x, w }); } +B md1Bl_c1(B D, B x) { Md1D* d=c(Md1D,D); Md1Block* b=c(Md1Block, d->m1); return actualExec(b->bl, b->sc, 5, (B[]){inci(D), x, bi_nothing, inci(d->m1), inci(d->f) }); } +B md1Bl_c2(B D, B w, B x) { Md1D* d=c(Md1D,D); Md1Block* b=c(Md1Block, d->m1); return actualExec(b->bl, b->sc, 5, (B[]){inci(D), x, w , inci(d->m1), inci(d->f) }); } +B md2Bl_c1(B D, B x) { Md2D* d=c(Md2D,D); Md2Block* b=c(Md2Block, d->m2); return actualExec(b->bl, b->sc, 6, (B[]){inci(D), x, bi_nothing, inci(d->m2), inci(d->f), inci(d->g)}); } +B md2Bl_c2(B D, B w, B x) { Md2D* d=c(Md2D,D); Md2Block* b=c(Md2Block, d->m2); return actualExec(b->bl, b->sc, 6, (B[]){inci(D), x, w , inci(d->m2), inci(d->f), inci(d->g)}); } B m_funBlock(Block* bl, Scope* psc) { if (bl->imm) return actualExec(bl, psc, 0, NULL); B r = mm_alloc(sizeof(FunBlock), t_fun_block, ftag(FUN_TAG));