aboutsummaryrefslogtreecommitdiff
path: root/bqn.js
blob: 52017727602a6fff9feab48cf98b8b80832ca812 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#! /usr/bin/env node

"use strict";
let path = require('path');
let fs = require('fs');

let bqn = require("./docs/bqn.js");
let {fmt,fmtErr,sysvals}=bqn;
let {has,list,str,unstr,dynsys,req1str}=bqn.util;

let show = x => console.log(fmt(x));
sysvals.show = (x,w) => { show(x); return x; };
sysvals.out = (x,w) => { console.log(req1str("•Out",x,w)); return x; };

let getres = e => {
  let p = sysvals.path;
  if (p) { p=unstr(p); return f=>path.resolve(p,f); }
  return f => { if (!path.isAbsolute(f)) throw Error(e+": Paths must be absolute when not running from a file"); return f; };
}
let withres = (e,fn) => dynsys(() => fn(getres(e)));
let ff = (e,fr,fw,o) => withres(e, resolve => (x,w) => {
  let f = resolve(req1str(e,has(w)?w:x));
  if (has(w)) { fs.writeFileSync(f,fw(x),o); return str(f); }
  else { return fr(fs.readFileSync(f,o)); }
});
sysvals.fchars = ff("•FChars",str,unstr,"utf-8");
sysvals.flines = ff("•FLines",s=>list(s.split('\n').map(str)),s=>s.map(unstr).join('\n'),"utf-8");
sysvals.fbytes = ff("•FBytes",s=>list(Array.from(s).map(c=>String.fromCodePoint(c))),s=>Buffer.from(s.map(c=>c.codePointAt(0))));
let bqn_state = sysvals.bqn = (x,w) => {
  w = w||[];
  sysvals.path=w[0]; sysvals.name=w[1]; sysvals.args=w[2];
  return bqn(x);
}
sysvals.bqn = (x,w) => bqn_state(req1str("•BQN",x), w);
let bqn_file = (f,t,w) => bqn_state(
  t, [ str(path.resolve(f,'..')+'/'), str(path.basename(f)), w ]
);
let imports = {};
sysvals.import = withres("•Import", resolve => (x,w) => {
  let f = resolve(req1str("•Import",x));
  let save = r=>r;
  if (!has(w)) {
    let c=imports[f]; if (has(c)) return c;
    save = r => (imports[f]=r);
    w=list([]);
  }
  return save(bqn_file(f, fs.readFileSync(f,'utf-8'), w));
});

if (!module.parent) {
  let args = process.argv.slice(2);
  let arg0 = args[0];
  let exec = fn => src => {
    try {
      fn(src);
    } catch(e) {
      console.error(''+fmtErr(Array.from(src),e)+'');
    }
  }
  if (arg0[0] !== '-' || (arg0==='-f'&&(arg0=(args=args.slice(1))[0],1))) {
    let f=arg0, a=list(args.slice(1).map(str));
    exec(s=>bqn_file(f,s,a))(fs.readFileSync(f,'utf-8'));
  } else if (arg0 === '-e') {
    args.slice(1).map(exec(s=>show(bqn_state(s))));
  }
}