pass derived function to modifiers

This commit is contained in:
dzaima 2021-04-06 13:25:19 +03:00
parent 6e2dcacf57
commit dd8e8b970b
7 changed files with 61 additions and 57 deletions

12
cc.bqn
View File

@ -9,14 +9,14 @@ L ← {"m_caB(" ∾(⍕≠𝕩)∾",(B[]){" ∾(1↓∾","⊸∾¨𝕩)∾"})
LI {"m_cai32("(𝕩)",(i32[]){"(1","¨𝕩)"})"} LI {"m_cai32("(𝕩)",(i32[]){"(1","¨𝕩)"})"}
# Escape the special characters that appear in BQN sources. # Escape the special characters that appear in BQN sources.
Esc{ Esc{
in (@+091013)"'""" # Null, Tab, LF, CR, and quotes in (@+091013)"'""" # Null, Tab, LF, CR, and quotes
out "0tnr" # Whitespace characters changed to letters out "0tnr" # Whitespace characters changed to letters
i in𝕩 i in𝕩
𝕩 i out((i<out)/) 𝕩 # Replace 𝕩 i out((i<out)/) 𝕩 # Replace
(i<in) /"\"¨ 𝕩 # Insert \ (i<in) /"\"¨ 𝕩 # Insert \
} }
Str "m_str32(U"""Esc""")"˜ # A BQN string Str "m_str32(U"""Esc""")"˙ # A BQN string
Char {"m_c32(U'"(Esc𝕩)"')"} # A BQN character Char {"m_c32(U'"(Esc𝕩)"')"} # A BQN character
Num {s"-"/˜𝕩<0 =|"m_f64("")"˜s| "m_f64("s"1.0/0.0)"𝕩} # Format number Num {s"-"/˜𝕩<0 =|"m_f64("")"˜s| "m_f64("s"1.0/0.0)"𝕩} # Format number
F # Format number F # Format number

View File

@ -2,17 +2,17 @@
typedef struct Md1D { // F _md typedef struct Md1D { // F _md
struct Fun; 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; B f;
} Md1D; } Md1D;
typedef struct Md2D { // F _md_ G typedef struct Md2D { // F _md_ G
struct Fun; struct Fun;
B m; B m2;
B f, g; B f, g;
} Md2D; } Md2D;
typedef struct Md2H { // _md_ G typedef struct Md2H { // _md_ G
struct Md1; struct Md1;
B m; B m2;
B g; B g;
} Md2H; } Md2H;
typedef struct Fork { typedef struct Fork {
@ -24,41 +24,41 @@ typedef struct Atop {
B g, h; B g, h;
} Atop; } Atop;
void md1D_free(B x) { dec(c(Md1D,x)->m); dec(c(Md1D,x)->f); } void md1D_free(B x) { dec(c(Md1D,x)->m1); 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 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)->m); dec(c(Md2H,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 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 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 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)->m);printf(" ");print(c(Md2D,x)->g);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)->m);printf(" ");print(c(Md2H,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 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 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_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)->m)->c2(c(Md1D, t)->m, c(Md1D, t)->f, w, 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)->m)->c1(c(Md2D, t)->m, c(Md2D, t)->f, c(Md2D, t)->g, 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)->m)->c2(c(Md2D, t)->m, c(Md2D, t)->f, c(Md2D, t)->g, w, 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_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 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 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_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 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_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 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)->m), inci(c(Md2D,x)->g)); 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)->m), inci(c(Md2H,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 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 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 // 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_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)->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_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)->m = m; c(Md2H,r)->g = g; c(Md2H,r)->c1=md2H_c1; c(Md2H,r)->c2=md2H_c2; 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_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_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 // 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"); } 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"); }

14
src/h.h
View File

@ -403,15 +403,19 @@ B c2(B f, B w, B x) { // BQN-call f dyadically; consumes w,x
typedef struct Md1 { typedef struct Md1 {
struct Value; struct Value;
BBB2B c1; // f(m,f, x); consumes x BB2B c1; // f(md1d{this,f}, x); consumes x
BBBB2B c2; // f(m,f,w,x); consumes w,x BBB2B c2; // f(md1d{this,f},w,x); consumes w,x
} Md1; } Md1;
typedef struct Md2 { typedef struct Md2 {
struct Value; struct Value;
BBBB2B c1; // f(m,f,g, x); consumes x BB2B c1; // f(md2d{this,f,g}, x); consumes x
BBBBB2B c2; // f(m,f,g,w,x); consumes w,x BBB2B c2; // f(md2d{this,f,g},w,x); consumes w,x
} Md2; } 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) { void arr_print(B x) {
usz r = rnk(x); usz r = rnk(x);

View File

@ -14,12 +14,12 @@
#include "i32arr.c" #include "i32arr.c"
#include "c32arr.c" #include "c32arr.c"
#include "utf.c" #include "utf.c"
#include "derv.c"
#include "arith.c" #include "arith.c"
#include "sfns.c" #include "sfns.c"
#include "md1.c" #include "md1.c"
#include "md2.c" #include "md2.c"
#include "sysfn.c" #include "sysfn.c"
#include "derv.c"
#include "vm.c" #include "vm.c"
void pr(char* a, B b) { void pr(char* a, B b) {

View File

@ -1,6 +1,6 @@
#include "h.h" #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"); if (!isArr(x)) return err("⌜: argument was atom");
usz ia = a(x)->ia; usz ia = a(x)->ia;
if (v(x)->type==t_harr && reusable(x)) { if (v(x)->type==t_harr && reusable(x)) {
@ -14,7 +14,7 @@ B tbl_c1(B t, B f, B x) {
dec(x); dec(x);
return r.b; 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)) { if (isArr(w) & isArr(x)) {
usz wia = a(w)->ia; ur wr = rnk(w); usz wia = a(w)->ia; ur wr = rnk(w);
usz xia = a(x)->ia; ur xr = rnk(x); 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"); if (!isArr(x)) return err("`: argument cannot be a scalar");
ur xr = rnk(x); ur xr = rnk(x);
if (xr==0) return err("`: argument cannot be a scalar"); 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); dec(x);
return r.b; 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"); if (!isArr(x)) return err("`: 𝕩 cannot be a scalar");
ur xr = rnk(x); usz* xsh = a(x)->sh; BS2B xget = TI(x).get; 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); HArr_p r = (v(x)->type==t_harr && reusable(x))? harr_parts(inci(x)) : m_harrc(x);

View File

@ -2,11 +2,11 @@
B val_c1(B t, B f, B g, B x) { return c1(f, x); } B val_c1(B d, B x) { return c1(c(Md2D,d)->f, x); }
B val_c2(B t, B f, B g, B w, B x) { return c2(g,w,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_c1(B d, B x) { return c1(c(Md2D,d)->f, x); }
B fillBy_c2(B t, B f, B g, B w, B x) { return c2(f,w,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 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; #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;

View File

@ -403,12 +403,12 @@ B actualExec(Block* bl, Scope* psc, u32 ga, B* svar) {
return r; 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_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) { return actualExec(c(FunBlock, t)->bl, c(FunBlock, t)->sc, 3, (B[]){inci(t), x, w }); } 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 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_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 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 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 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_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 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 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) { B m_funBlock(Block* bl, Scope* psc) {
if (bl->imm) return actualExec(bl, psc, 0, NULL); if (bl->imm) return actualExec(bl, psc, 0, NULL);
B r = mm_alloc(sizeof(FunBlock), t_fun_block, ftag(FUN_TAG)); B r = mm_alloc(sizeof(FunBlock), t_fun_block, ftag(FUN_TAG));