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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
let body = document.body;
let doc={}; // html elements with a class
body.querySelectorAll('[class]').forEach(e=>doc[e.classList[0]]=e);
let setcount = !doc.count ? (s=>s) : (s=>{
let l = Array.from(s).length;
doc.count.textContent = l+" char"+(l!=1?"s":"");
});
let repl = ()=>{
let s=doc.code.value;
doc.rslt.classList.remove('err');
doc.rslt.textContent=' ';
setcount(s);
setTimeout(() => {
try {
doc.rslt.textContent=fmt(bqn(s));
} catch(e) {
let r=e.src, w=e.message, is=null;
if (r==='Compiler'&&w.sh[0]===2) [is,w]=w;
if (r==='!') w=w?fmt(w).replace(/^/gm,'! '):'! Error';
else w=w.sh?w.join(''):w;
if (is!==null) {
let n=is.sh?is.sh[0]:0, i=n?is[0]:is;
let to=i=>Array.from(s).slice(0,i).join('').split('\n');
let ll=to(i), l=ll.length-1, j=ll[l].length, m=to()[l];
let k=1,o=i-j,cl=j; while (k<n&&(cl=is[k]-o)<m.length) k++;
let c=Array(cl).fill(0); c[j]=1;
for (let h=1;h<k;h++) c[is[h]-o]=1;
w = [w,'',m,c.map(t=>t?'^':' ').join('')].join('\n');
if (k<n) w+='\n'+'(and other lines)';
}
doc.rslt.classList.add('err');
doc.rslt.textContent=w;
}
}, 0);
}
if (doc.run) doc.run.onclick = repl;
let keymode=0; // 1 for backslash
doc.code.onkeydown = ev => {
let k = ev.which;
if (16<=k && k<=20) {
return;
} if (k==13 && (ev.shiftKey||ev.ctrlKey||ev.altKey||ev.metaKey)) { // *-enter
repl(); return false;
} if (keymode) {
keymode = 0;
doc.kb.classList.remove('backslash');
let c = keys[ev.key];
if (c) return typeChar(ev.target, c, ev);
} else if (ev.key=='\\') {
keymode = 1;
doc.kb.classList.add('backslash');
ev.preventDefault();
}
}
let typeChar = (t, c, ev) => {
ev.preventDefault();
let v = t.value;
let i = t.selectionStart;
t.value = v.slice(0,i)+c+v.slice(t.selectionEnd);
t.selectionStart = t.selectionEnd = i+c.length;
return false;
}
let syncls={ v:"Value", f:"Function", m:"Modifier", d:"Modifier2", n:"Number", g:"Gets", p:"Paren", b:"Bracket", k:"Brace", l:"Ligature", n:"Nothing", s:"Separator", c:"Comment", a:"String" };
let keydesc='f+Conjugate;Add_f-Negate;Subtract_f×Sign;Multiply_f÷Reciprocal;Divide_f⋆Exponential;Power_f√Square Root;Root_f⌊Floor;Minimum_f⌈Ceiling;Maximum_f∧Sort Up;And_f∨Sort Down;Or_f¬Not;Span_f|Absolute Value;Modulus_f≤Less Than or Equal to_f<Enclose;Less Than_f>Merge;Greater Than_f≥Greater Than or Equal to_f=Rank;Equals_f≠Length;Not Equals_f≡Depth;Match_f≢Shape;Not Match_f⊣Identity;Left_f⊢Identity;Right_f⥊Deshape;Reshape_f∾Join;Join to_f≍Solo;Couple_f↑Prefixes;Take_f↓Suffixes;Drop_f↕Range;Windows_f«Shift Before_f»Shift After_f⌽Reverse;Rotate_f⍉Transpose;Reorder axes_f/Indices;Replicate_f⍋Grade Up;Bins Up_f⍒Grade Down;Bins Down_f⊏First Cell;Select_f⊑First;Pick_f⊐Index of_f⊒Occurrence Count;Progressive Index of_f∊Unique Mask;Member of_f⍷Deduplicate;Find_f⊔Group Indices;Group_f!Assert;Assert with message_m˙Constant_m˜Self/Swap_d∘Atop_d○Over_d⊸Before/Bind_d⟜After/Bind_d⌾Under_d⊘Valences_d◶Choose_d⎉Rank_m˘Cells_d⚇Depth_m¨Each_m⌜Table_d⍟Repeat_m⁼Undo_m´Fold_m˝Insert_m`Scan_g←Define_g⇐Export_g↩Change_g→Return_s⋄Separator_s,Separator_p(Begin expression_p)End expression_k{Begin block_k}End block_b⟨Begin list_b⟩End list_l‿Strand_n·Nothing_v•System_v𝕨Left argument_f𝕎Left argument (as function)_v𝕩Right argument_f𝕏Right argument (as function)_v𝕗Modifier left operand (as subject)_f𝔽Modifier left operand_v𝕘2-modifier right operand (as subject)_f𝔾2-modifier right operand_v𝕤Current function (as subject)_f𝕊Current function_m𝕣Current modifier_n¯Minus_nπPi_n∞Infinity_a@Null character_c#Comment'.split(/[\n_]/);
let kk=Array.from('`123456890-=~!@#$%^&*()_+qwertuiop[]QWERTIOP{}asdfghjkl;ASFGHKL:"zxcvbm,./XVBM<>? \'');
let kv=Array.from('˜˘¨⁼⌜´˝∞¯•÷׬⎉⚇⍟◶⊘⎊⍎⍕⟨⟩√⋆⌽𝕨∊↑∧⊔⊏⊐π←→↙𝕎⍷𝕣⍋⊑⊒⍳⊣⊢⍉𝕤↕𝕗𝕘⊸∘○⟜⋄↖𝕊𝔽𝔾«⌾»·˙⥊𝕩↓∨⌊≡∾≍≠𝕏⍒⌈≢≤≥⇐‿↩');
let keys={}, revkeys={};
kk.map((k,i)=>{keys[k]=kv[i];revkeys[kv[i]]=k;});
doc.kb.innerHTML = keydesc.map(d=>{
let s = syncls[d[0]];
let c = Array.from(d)[1];
let t = d.slice(1+c.length).replace(';','\n');
let k = revkeys[c]; if (k) t += '\n\\ '+(k==='"'?'"':k);
return '<span title="'+t+'" class="'+s+'">'+c+'</span>'
}).join("​"); // zero-width space
doc.kb.onmousedown = ev => {
let t = ev.target;
if (t.nodeName === 'SPAN') {
return typeChar(doc.code, t.textContent, ev);
}
}
if (doc.perm) doc.perm.onmouseover = doc.perm.onfocus = () => {
let b=(new TextEncoder()).encode(doc.code.value);
doc.perm.href='#code='+btoa(String.fromCharCode(...b));
}
let demo = 0;
if (doc.demo) doc.demo.onclick = () => {
const demos = [
'<⟜\'a\'⊸/ "Big Questions Notation"'
,'≠⌜˜ 8 ⥊ 0‿1'
,'+´ 1 + ↕100'
,'(+´ ÷ ≠) 2‿5‿7‿4'
,'+`-˝ "()" =⌜ "(2×(4-1)÷(√9))"'
,'(⊑ + ↕∘¬˜´) "CG"'
,'0‿1‿10‿100⊸⍋⊸⊔ ⟨6,11,9,20,105,1,¯1,4⟩'
,'{(+`𝕩<\'a\') ⊔ 𝕩} "camelCaseWord"'
,'3‿4‿2⌾(0‿0⊸⍉) 3‿3⥊¯1'
,'∾ (<˘ ≍¨¨ 1↓↓) "abcd"'
,'Life←{∨´1‿𝕩∧3‿4=+˝⥊⌽⟜𝕩¨∾⌜˜¯1‿0‿1}\nLife⍟(↕4) 6‿6↑(1⊸=∨5⊸≤)3‿3⥊↕9'
,'⥊ 1‿0‿1 ∧⌜⍟3 1'
,'⌈˝ (≠ ↕ 0‿0⊸∾) 1‿2‿5‿4‿0‿2‿1'
];
++demo; if (demo===demos.length) demo=0;
doc.code.value = demos[demo]; repl();
}
if (location.hash) {
let code='', run=1;
location.hash.slice(1).split('&').map(s => {
if (s.slice(0,5)==='code=') code=s.slice(5);
if (s.slice(0,3)==='norun') run=0;
});
let b=atob(code);
b=new Uint8Array([...b].map(c=>c.charCodeAt(0)));
setcount(doc.code.value = (new TextDecoder()).decode(b));
if (run) repl();
}
doc.code.focus();
|