aboutsummaryrefslogtreecommitdiff
path: root/wc.bqn
blob: c66a2c8c942a681babc2a26c4259cdf1472e29b5 (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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#! /usr/bin/env bqn

# WebAssembly backend (very incomplete)

i"⟨cgl,charSet,Tokenize⟩"
cgl,charSet,Tokenize  •path,"",•Import"src/glyphs.bqn" •BQN i˜•FChars"src/c.bqn"
chF(cgl)charSet
bFb1b2bSbHbGbBbLbObXbNbDbAbWbP¨˜(0»+`)cgl
M1(0≤∧>)-
vibN

WParse{
  a𝕩M(2˜bG)at1a𝕩/˜¬aa/˜¬at
  l𝕩sep𝕩M bS𝕩(bF+⊑chF⊐<'⊣')¨(sep/)𝕩sep𝕩=2+⊑bB
  o𝕩=⊑bBc𝕩=1+⊑bBva-˜𝕩vif¬ocvsep
  na(2×sep)+f×1+l0cv
  d+`o-cfe(+`((d))o)l(⍋⊏d)⊏/c
  fel-l↑⌽⌈`×⌽1˜sep
  sel¬(oc)/⍋((f×fe)⌈↕l)-+`f-l↑/f/fe
  sel¨𝕩na
}

Base{+(𝕨×)´𝕩}
Enc2{2|⌊÷2(𝕨)𝕩}

Hex16 Base ("0A"+¨106)

GenF64{
  0:80;
  l2(⌊⋆)𝕩
  (Hex"44")2 Base˘88⥊∾¯52(0l)Enc2𝕩,11 Enc2 1023+l,0
}
MakeTab{{(0)¨¯1(chF𝕨)((chF))𝕩}(¨¨)˝(2(÷˜∾⊣))𝕩}
tab1MakeTab
  "⊣⊢"     , 2⥊<⟨⟩
  "|-⌈⌊√"  , (Hex"99")+(4)6
  "÷"      , <(Hex"10")0
  "¬"      , <∾⥊¨Hex"9A",GenF64 1,Hex"A0"

tab2MakeTab
  "⊣"      , Hex"1A"
  "+-×÷⌊⌈∧", (Hex"A0")+(6)2
  "¬"      , <∾⥊¨Hex"A1",GenF64 1,Hex"A0"
  "∨"      , <(Hex"10")1

fntab(0¨tab1)tab1tab2
f64127-3

GenFn{
  t,r,k3!0¨¨,⟨⟩⟩Tokenize𝕩
  nVar≠⊑klits1k
  nLocnVar-𝕨0
  t˜⍋+`-˝(23+⊑bB)=t
  nd+´ct=3+⊑bB
  t((vi+nVar+≠lits)+↕)(c/)t
  a,naWParse t
  ops⥊∾
    (0˜3˜vi-≠)fntab
    (Hex¨"20""22""21")nVar
    (3)(GenF64¨lits)(Hex"10")¨3+↕nd
  
  (((≠∾∾)nLocf64)(Hex"0B")˜)¨((⊢-˜¬×+`)a=2+⊑bB)(na+3×a)ops
}

Gen{
  LEB{0:0;128+(¯1) 2 Base˘ (`⌽∨˝˘)/ 107(⊣⥊×´) 64 Enc2 𝕩}
  CLEB
  SC
  V≠∾∾
  IC-@
  tnb𝕩
  
   0("asm"-@)41
   1 S V (96∾C¨)¨t
   3 S V ¨↕≠b
   7 S V ⥊<"fn"I(⊣∾0≍⊢)n
  10 S V C¨ b
  
}

rcp1 GenFn "1÷x"
or 2 GenFn "(w+x)-w∧x"
WCompile{
  bodyGenFn 𝕩
  frcp,or,body
  Gen (¨f)/(120¨1)¨¨f64  2  f
}

•Out ((@+10)«·(" "∾•Repr)¨)WCompile¨ •args