-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathnk.html
More file actions
145 lines (132 loc) · 7.63 KB
/
Copy pathnk.html
File metadata and controls
145 lines (132 loc) · 7.63 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<head><meta charset="utf-8"><title>w</title></head>
<link rel='icon' type'image/png' href="k32.png">
<style>
html,body,textarea,input,select{margin:0;padding:0;overflow:hidden;font-family:monospace;}table{position:absolute;width:100%;height:100%;border-collapse:collapse;}td{width:50%;}
textarea{top:0;left:0;width:100%;height:100%;background:black;color:#cccccc;border:none;resize:none;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;}::-webkit-scrollbar{width:0;height:0;}
textarea:focus{color:white;}.hold{background:#666666}
</style>
<body>
<table><tr>
<td><textarea id="nterm" class="term" wrap="off" spellcheck="false"></textarea></td>
<td><textarea id="kterm" class="term" wrap="off" spellcheck="false"></textarea></td></tr><tr>
<td><textarea id="oterm" class="term" wrap="off" spellcheck="false"></textarea></td>
<td><textarea id="sterm" class="term" wrap="off" spellcheck="false"></textarea></td>
</tr></table>
<script src="oK.js"></script>
<script>
var nterm = document.getElementById("nterm")
var kterm = document.getElementById("kterm")
var oterm = document.getElementById("oterm")
var sterm = document.getElementById("sterm")
var terms = [nterm, kterm, oterm, sterm]
function kd(e){var N="\n";var t=e.srcElement;
if(e.which===27){pd(e);if(t.hold){t.className="";t.selectionStart=t.hold;t.hold=0}else{t.hold=t.selectionStart;t.className="hold"}}
if(e.which===13&&!t.hold){pd(e);let s=t.value,p=t.selectionStart,q=t.selectionEnd;if(p===q){p=s.slice(0,p).lastIndexOf(N)+1;q+=s.slice(q).indexOf(N)+1}else{t.value+=s.slice(p,q)}S=s.slice(p,q);exec(S,t)}
}
function dbl(e){var t=e.srcElement;t.full=!t.full;t.style.position=t.full?"absolute":""}
function out(t,s){return function(s){t.value+=s;t.scrollTo(0,t.scrollHeight)}}
for(var i=0;i<terms.length;i++){var t=terms[i];t.onkeydown=kd;t.ondblclick=dbl;t.O=out(t);t.hold=0}
function pd(e){if(e){e.preventDefault();e.stopPropagation()}};
function exec(s,t) {s=s.trim();
terms=t.full?[t]:[nterm,kterm,oterm,sterm]
if(s=="clear"){nterm.value=kterm.value=oterm.value=sterm.value=" ";return}
if((s=="\\")||(s=="\\h")){for(var i=0;i<terms.length;i++){var t=terms[i];t.value+="\n"+t.help+"\n ";t.scrollTo(0,t.scrollHeight)};return}
for(var i=0;i<terms.length;i++){if((t!=terms[i])||(t.selectionEnd!=t.value.length))terms[i].value+=s;terms[i].exec(s)}
}
nterm.value = "ngn\n "
kterm.value = "ktye\n "
oterm.value = "oK\n "
sterm.value = "nyi\n "
nterm.exec = function(s){nterm.value+="\n";S=s.replaceAll("\n",";");N.rep();nterm.O(" ")}
kterm.exec = function(s){var s=ktry(s);kterm.O(s.length?"\n"+s+"\n ":"\n ")}
oterm.exec = function(s){oterm.value+="\n";try{s=format(run(parse(s),env));s=s.length?s+"\n ":s}catch(e){s=e.message+"\n"}oterm.O(s)}
sterm.exec = function(s){sterm.O("\nnyi\n ")}
function KO(s){kterm.value += s;kterm.scrollTo(0,kterm.scrollHeight)}
function NO(s){nterm.value += s;nterm.scrollTo(0,nterm.scrollHeight)}
function OO(s){oterm.value += s;oterm.scrollTo(0,oterm.scrollHeight)}
function SO(s){sterm.value += s;sterm.scrollTo(0,sterm.scrollHeight)}
function us(s){return new TextEncoder("utf-8").encode(s)}
function su(u){return (u.length)?new TextDecoder("utf-8").decode(u):""}
function cu(u){var x=mk(1,u.length);K.C.set(u,8+x);return x}
function sk(x){var n=nn(x);var s=su(K.C.slice(x+8,x+8+n));dx(x);return s}
// ktye wasm module
var K
var draw = function(w,h,p){}
var grow = function(x) {var cur=K.exports.mem.buffer.byteLength;if((1<<x)>cur){var a=(1<<x)-cur;K.exports.mem.grow(a>>>16); msl()};return x}
var printc= function(x,y) {KO(su(K.C.slice(x,x+y)))}
var msl = function() {var b=K.exports.mem.buffer;K.C=new Uint8Array(b);K.U=new Uint32Array(b);K.I=new Int32Array(b);K.F=new Float64Array(b)}
var nn, tp, dx, mk, sc, val, kst, bak
fetch('k.wasm').then(r=>r.arrayBuffer()).then(r=>WebAssembly.instantiate(r,{"ext":{"sin":Math.sin,"cos":Math.cos,"exp":Math.exp,"log":Math.log,"atan2":Math.atan2,"hypot":Math.hypot,"draw":draw,"grow":grow,"printc":printc} })).then(r=>{
K=r.instance;msl();K.exports.ini(16);bak=K.C.slice(0)
nn=K.exports.nn;tp=K.exports.tp;dx=K.exports.dx;rx=K.exports.rx;mk=K.exports.mk;sc=K.exports.sc;val=K.exports.val;kst=K.exports.kst
});
function ktry(s){
try {var x=sk(kst(val(cu(us(s))))); bak=K.C.slice(0, 1<<K.U[32]);return x}
catch(e){K.C.set(bak);return "!\n"}}
// ngn wasm module
var N
var S = ""
var te = new TextEncoder('utf-8')
var td = new TextDecoder('utf-8')
var NM, H
function read(_,a,n){let s=S+'\n';S='';return te.encodeInto(s,NM.subarray(a,a+n)).written}
function write(_,a,n){NO(td.decode(NM.subarray(a,a+n)));return n}
function mmap(_,n){H+=n;if(H>NM.length){N.memory.grow((H-NM.length-1>>>16)+1);uM()}return H-n}
function O(){return 0}
fetch('ngn.wasm').then(r=>r.arrayBuffer()).then(r=>WebAssembly.instantiate(r,{env:{read,write,mmap,munmap:O,exit:O,hop:O,hcl:O,now:O,u0c:O,u1c:O,cmd:O,v0c:O,v1c:O,frk:O}}))
.then(x=>{N=x.instance.exports;NM=new Uint8Array(N.memory.buffer);H=N.__heap_base;N.init()})
// ok
var env = baseEnv()
kterm.help = ""; fetch('h').then(r=>{return r.text()}).then(s=>{kterm.help=s})
nterm.help = [": assign RETURN ' each|slide|bin",
"+ add transpose / fold|join |dec / comment",
"- subtract negate \\ scan|split|enc \\ exit",
"* multiply first ': eachprior \\t:n x time",
"% divide sqrt /: eachright \\l a.k load",
"! mod|dict enum|key \\: eachleft \\w workspace",
"& min|and where \\cmd system",
"| max|or reverse a \\b trace",
"< less asc 0: lines i/o",
"> more desc 1: bytes i/o !n enum",
"= equal group !N odometer",
"~ match not n?x draw",
", concat enlist -n?x deal",
"^ fill|w/o null? =n unitmatrix",
"# reshape length `p@s parse",
"_ drop|cut floor `k@x fmt",
"$ cast string $[c;t;f] COND `j?s json",
"? find|rnd uniq `t[] time",
"@ apply(1) type @[x;i;[f;]y] amend `e[] printerror",
". apply(n) eval .[x;i;[f;]y] drill `x@(argv;in) fork"].join("\n")
oterm.help = `oK has atom, list (2;\`c), dict \`a\`b!(2;\`c) and func {[x;y]x+y}
20 primitives/verbs, 6 operators/adverbs and 3 system functions
Verb (unary) Adverb Noun (null)
: gets ' each name \`a\`b \`
+ plus flip / over|join char "ab" " "
- minus negate \\ scan|split num 2 .3 0N(nan) 0w(inf)
* times first ': eachprior hex 0x2a2b
% divide sqrt /: eachright bool 01000b
! mod|map enum|key \\: eachleft
& min|and where
| max|or reverse System list (2;3.4;\`ab)
< less asc 0: url r/w(line) dict \`a\`b!(2;\`c)
> more desc 1: json r/w view f::32+1.8*c
= equal group 5: printable form func {[c]32+1.8*c}
~ match not
, concat enlist
^ except null \\t x time
# take|rsh count \\e editor
_ drop|cut floor \\r run editor
$ cast|sum string $[c;t;f] COND \\v variables
? find|rnd distinct ?[x;I;[f;]y] insert \\f functions
@ at type @[x;i;[f;]y] amend \\c clear log
. dot eval|val .[x;i;[f;]y] dmend \\u make url
A manual of the oK language is available with more details:
https://github.com/JohnEarnest/ok/blob/gh-pages/docs/Manual.md
A more general introduction to array programming is also provided:
https://github.com/JohnEarnest/ok/blob/gh-pages/docs/Programming.md
`
sterm.help = "nyi"
</script>
</body>
</html>