dyadic •file.At

This commit is contained in:
dzaima 2021-10-12 00:34:44 +03:00
parent 6860ba5f9d
commit d98cb0b80a
2 changed files with 13 additions and 5 deletions

View File

@ -243,12 +243,12 @@ static B vfyStr(B x, char* name, char* arg) {
return x; return x;
} }
extern B replPath; // defined in main.c B cdPath;
static B args_path(B* fullpath, B w, char* name) { // consumes w, returns args, writes to fullpath static B args_path(B* fullpath, B w, char* name) { // consumes w, returns args, writes to fullpath
if (!isArr(w) || rnk(w)!=1 || a(w)->ia>3) thrF("%U: 𝕨 must be a vector with at most 3 items, but had shape %H", name, w); if (!isArr(w) || rnk(w)!=1 || a(w)->ia>3) thrF("%U: 𝕨 must be a vector with at most 3 items, but had shape %H", name, w);
usz ia = a(w)->ia; usz ia = a(w)->ia;
SGet(w) SGet(w)
B path = ia>0? vfyStr(Get(w,0),name,"path" ) : inc(replPath); B path = ia>0? vfyStr(Get(w,0),name,"path" ) : inc(cdPath);
B file = ia>1? vfyStr(Get(w,1),name,"filename") : emptyCVec(); B file = ia>1? vfyStr(Get(w,1),name,"filename") : emptyCVec();
B args = ia>2? Get(w,2) : emptySVec(); B args = ia>2? Get(w,2) : emptySVec();
*fullpath = vec_join(vec_add(path, m_c32('/')), file); *fullpath = vec_join(vec_add(path, m_c32('/')), file);
@ -503,7 +503,7 @@ B reBQN_c1(B t, B x) {
i32 replVal = q_N(repl) || eqStr(repl,U"none")? 0 : eqStr(repl,U"strict")? 1 : eqStr(repl,U"loose")? 2 : 3; i32 replVal = q_N(repl) || eqStr(repl,U"none")? 0 : eqStr(repl,U"strict")? 1 : eqStr(repl,U"loose")? 2 : 3;
if (replVal==3) thrM("•ReBQN: Invalid repl value"); if (replVal==3) thrM("•ReBQN: Invalid repl value");
dec(x); dec(x);
Block* initBlock = bqn_comp(m_str8l("\"(REPL initializer)\""), inc(replPath), m_f64(0)); Block* initBlock = bqn_comp(m_str8l("\"(REPL initializer)\""), inc(cdPath), m_f64(0));
B scVal; B scVal;
if (replVal==0) { if (replVal==0) {
scVal = bi_N; scVal = bi_N;
@ -545,6 +545,12 @@ static NFnDesc* fileAtDesc;
B fileAt_c1(B d, B x) { B fileAt_c1(B d, B x) {
return path_resolve(nfn_objU(d), x); return path_resolve(nfn_objU(d), x);
} }
B fileAt_c2(B d, B w, B x) {
vfyStr(w,"(file).At","𝕨");
B r = path_resolve(w, x);
dec(w);
return r;
}
static NFnDesc* fCharsDesc; static NFnDesc* fCharsDesc;
B fchars_c1(B d, B x) { B fchars_c1(B d, B x) {
return file_chars(path_resolve(nfn_objU(d), x)); return file_chars(path_resolve(nfn_objU(d), x));
@ -791,9 +797,11 @@ B sys_c1(B t, B x) {
return harr_fcd(r, x); return harr_fcd(r, x);
} }
B cdPath;
void sysfn_init() { void sysfn_init() {
cdPath = m_str8(1, "."); gc_add(cdPath);
fCharsDesc = registerNFn(m_str8l("(file).Chars"), fchars_c1, fchars_c2); fCharsDesc = registerNFn(m_str8l("(file).Chars"), fchars_c1, fchars_c2);
fileAtDesc = registerNFn(m_str8l("(file).At"), fileAt_c1, c2_bad); fileAtDesc = registerNFn(m_str8l("(file).At"), fileAt_c1, fileAt_c2);
fLinesDesc = registerNFn(m_str8l("(file).Lines"), flines_c1, flines_c2); fLinesDesc = registerNFn(m_str8l("(file).Lines"), flines_c1, flines_c2);
fBytesDesc = registerNFn(m_str8l("(file).Bytes"), fbytes_c1, fbytes_c2); fBytesDesc = registerNFn(m_str8l("(file).Bytes"), fbytes_c1, fbytes_c2);
importDesc = registerNFn(m_str32(U"•Import"), import_c1, import_c2); importDesc = registerNFn(m_str32(U"•Import"), import_c1, import_c2);

View File

@ -3,7 +3,7 @@
#include "utils/utf.h" #include "utils/utf.h"
#include "utils/file.h" #include "utils/file.h"
B replPath; // also used by sysfn.c static B replPath;
static Scope* gsc; static Scope* gsc;
static bool init = false; static bool init = false;