166 lines
4.4 KiB
C
166 lines
4.4 KiB
C
// #define ATOM_I32
|
|
#ifdef DEBUG
|
|
// #define DEBUG_VM
|
|
#endif
|
|
// #define ALLOC_STAT
|
|
|
|
#include "h.h"
|
|
#include "mm.c"
|
|
#include "harr.c"
|
|
#include "i32arr.c"
|
|
#include "arith.c"
|
|
#include "sfns.c"
|
|
#include "md1.c"
|
|
#include "md2.c"
|
|
#include "sysfn.c"
|
|
#include "derv.c"
|
|
#include "vm.c"
|
|
#include "utf.c"
|
|
|
|
void pr(char* a, B b) {
|
|
printf("%s", a);
|
|
print(b);
|
|
puts("");
|
|
dec(b);
|
|
fflush(stdout);
|
|
}
|
|
|
|
Block* ca3(B b) {
|
|
B* ps = harr_ptr(b);
|
|
Block* r = compile(inci(ps[0]),inci(ps[1]),inci(ps[2]));
|
|
dec(b);
|
|
return r;
|
|
}
|
|
|
|
B m_str8(char* s) {
|
|
u64 sz = strlen(s);
|
|
HArr_p r = m_harrv(sz);
|
|
for (u64 i = 0; i < sz; i++) r.a[i] = m_c32(s[i]);
|
|
return r.b;
|
|
}
|
|
B m_str32(u32* s) {
|
|
u64 sz = 0;
|
|
while(s[sz])sz++;
|
|
HArr_p r = m_harrv(sz);
|
|
for (u64 i = 0; i < sz; i++) r.a[i] = m_c32(s[i]);
|
|
return r.b;
|
|
}
|
|
B m_cai32(usz ia, i32* a) {
|
|
B r = m_i32arrv(ia);
|
|
i32* rp = i32arr_ptr(r);
|
|
for (usz i = 0; i < ia; i++) rp[i] = a[i];
|
|
return r;
|
|
}
|
|
|
|
__ssize_t getline (char **__restrict __lineptr, size_t *restrict n, FILE *restrict stream);
|
|
|
|
int main() {
|
|
hdr_init();
|
|
harr_init();
|
|
i32arr_init();
|
|
arith_init();
|
|
sfns_init();
|
|
md1_init();
|
|
md2_init();
|
|
sysfn_init();
|
|
derv_init();
|
|
comp_init();
|
|
|
|
|
|
// fake runtime
|
|
// B bi_N = bi_nothing;
|
|
// B runtime[] = {
|
|
// /* +-×÷⋆√⌊⌈|¬ */ bi_add, bi_sub , bi_mul , bi_div, bi_pow, bi_N , bi_floor, bi_N , bi_N, bi_N,
|
|
// /* ∧∨<>≠=≤≥≡≢ */ bi_N , bi_N , bi_N , bi_N , bi_N , bi_eq, bi_le , bi_N , bi_N, bi_fne,
|
|
// /* ⊣⊢⥊∾≍↑↓↕«» */ bi_lt , bi_rt , bi_shape, bi_N , bi_N , bi_N , bi_N , bi_ud , bi_N, bi_N,
|
|
// /* ⌽⍉/⍋⍒⊏⊑⊐⊒∊ */ bi_N , bi_N , bi_N , bi_N , bi_N , bi_N , bi_pick , bi_N , bi_N, bi_N,
|
|
// /* ⍷⊔!˙˜˘¨⌜⁼´ */ bi_N , bi_N , bi_asrt , bi_N , bi_N , bi_N , bi_N , bi_tbl, bi_N, bi_N,
|
|
// /* ˝`∘○⊸⟜⌾⊘◶⎉ */ bi_N , bi_scan, bi_N , bi_N , bi_N , bi_N , bi_N , bi_val, bi_N, bi_N,
|
|
// /* ⚇⍟ */ bi_N , bi_N
|
|
// };
|
|
// Block* c = ca3(
|
|
// #include "interp"
|
|
// );
|
|
// B interp = m_funBlock(c, 0); ptr_dec(c);
|
|
// pr("interpreted: ", interp);
|
|
|
|
Block* runtime_b = compile(
|
|
#include "runtime"
|
|
);
|
|
B rtRes = m_funBlock(runtime_b, 0); ptr_dec(runtime_b);
|
|
B rtObj = TI(rtRes).get(rtRes,0);
|
|
B rtFinish = TI(rtRes).get(rtRes,1);
|
|
B* runtime = toHArr(rtObj)->a;
|
|
runtimeLen = c(Arr,rtObj)->ia;
|
|
for (usz i = 0; i < runtimeLen; i++) {
|
|
if (isVal(runtime[i])) v(runtime[i])->flags|= i+1;
|
|
}
|
|
c1(rtFinish, m_v2(inci(bi_decp), inci(bi_primInd)));
|
|
|
|
// uncomment to use src/interp; needed for test.bqn
|
|
// Block* c = ca3(
|
|
// #include "interp"
|
|
// );
|
|
// B interp = m_funBlock(c, 0); ptr_dec(c);
|
|
// pr("result: ", interp);
|
|
// exit(0);
|
|
|
|
Block* comp_b = compile(
|
|
#include "compiler"
|
|
);
|
|
B comp = m_funBlock(comp_b, 0); ptr_dec(comp_b);
|
|
|
|
|
|
// uncomment to self-compile and use that for the REPL; expects a copy of mlochbaum/BQN/src/c.bqn to be at the execution directory
|
|
// char* c_src = 0;
|
|
// u64 c_len;
|
|
// FILE* f = fopen("c.bqn", "rb");
|
|
// if (f) {
|
|
// fseek(f, 0, SEEK_END);
|
|
// c_len = ftell(f);
|
|
// fseek(f, 0, SEEK_SET);
|
|
// c_src = malloc(c_len);
|
|
// if (c_src) fread(c_src, 1, c_len, f);
|
|
// fclose(f);
|
|
// } else {
|
|
// printf("couldn't read c.bqn\n");
|
|
// exit(1);
|
|
// }
|
|
// if (c_src) {
|
|
// B cbc = c2(comp, inci(rtObj), fromUTF8(c_src, c_len));
|
|
// Block* cbc_b = ca3(cbc);
|
|
// comp = m_funBlock(cbc_b, 0);
|
|
// free(c_src);
|
|
// }
|
|
|
|
|
|
while (true) { // exit by evaluating an empty expression
|
|
char* ln = NULL;
|
|
size_t gl = 0;
|
|
getline(&ln, &gl, stdin);
|
|
if (ln[0]==10) break;
|
|
B obj = fromUTF8(ln, strlen(ln));
|
|
B cbc = c2(comp, inci(rtObj), obj);
|
|
free(ln);
|
|
Block* cbc_b = ca3(cbc);
|
|
pr("", m_funBlock(cbc_b, 0));
|
|
}
|
|
|
|
dec(rtRes);
|
|
dec(comp);
|
|
|
|
#ifdef ALLOC_STAT
|
|
printf("ctrA←"); for (i64 j = 0; j < Type_MAX; j++) { if(j)printf("‿"); printf("%lu", ctr_a[j]); } printf("\n");
|
|
printf("ctrF←"); for (i64 j = 0; j < Type_MAX; j++) { if(j)printf("‿"); printf("%lu", ctr_f[j]); } printf("\n");
|
|
for(i64 i = 0; i < actrc; i++) {
|
|
u32* c = actrs[i];
|
|
bool any = false;
|
|
for (i64 j = 0; j < Type_MAX; j++) if (c[j]) any=true;
|
|
if (any) {
|
|
printf("%ld", i);
|
|
for (i64 j = 0; j < Type_MAX; j++) printf("‿%u", c[j]);
|
|
printf("\n");
|
|
}
|
|
}
|
|
#endif
|
|
} |