aboutsummaryrefslogtreecommitdiff
path: root/src/c.bqn
blob: 0dda3c25979d4d7b3cb4a3a473458ef4fab1ea13 (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
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
#! ./dzref

tab'	'nl'
'
dig  "0123456789"
alph  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
alow  "abcdefghijklmnopqrstuvwxyz"
charGroups
  chF"+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!" # Function
  "˜˘¨⌜⁼´˝`"            # Modifier
  "∘○⊸⟜⌾⊘◶⎉⚇⍟"          # Composition
  nl"⋄,"               # Separator
  "←↩→"                 # Gets
  "(){}⟨⟩"              # Bracket
  "‿"                   # Ligature
  "·"                   # nOthing
  "𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕗𝕘"          # Input (𝕣 pending; ℝ not allowed)
  dig                   # Digit
  "¯.π∞"                # Numeric
  alowalph"_"         # Alphabetic
  " "tab               # Whitespace
# #'" eliminated during tokenization

CharCode(charGroups){g𝕗g˜1-˜(g𝕗)⍋⊢}
bFbMbCbSbGbBbLbObIbDbNbAbW¨˜(+`≠↑0∾⊢)¨charGroups
bA_e4+⊑bA
M1(0≤∧>)-
vi+´¨9charGroups
charRole((vi-1bI)↑/0∾≠¨3charGroups)(5/⌽↕2)0
spc356-30

Tokenize{
  r𝕩='#'s/(≠↑2)𝕩='''⋄d←/𝕩='"'
  g←⍋q←∾⟨  s⋄¯1↓d⋄/r⟩ ⋄q↩g⊏q
  e← g⊏∾⟨2+s⋄ 1↓d⋄(⊢-¯1↓0∾⊢)∘⊏⟜(0∾+`r)⊸//(𝕩=nl)∾1⟩
  Se←{(⊏˜𝕨)Se 1¨⌾((𝕩/𝕨)⊸⊏)𝕩}⍟{0=⊑⌽𝕩}
  st←¯1↓Se⟜(1↑˜≠)∾⟜≠q⍋e⋄b←st/q∾˘e
  ToI←¯1↓·/⁼(≠𝕩)∾˜⥊⋄f←¬≠`ToI b
  cb←(¬(st/q)⊏r)/b
  lu←⍷lit←𝕩⊔˜1-˜(+`ToI⊑˘cb)×≠`ToI cb
  cl←f/ToI⊑∘⌽˘cb

  c←CharCode f/𝕩
  w←(≠↑0∾⊢)⊸<l←c M (⊑bD)≍+´1⊑¨bD‿bN‿bA
  i←(1-˜l×+`w)⊔c
  na←≠alph⋄us←¯1++´bA
  in←na(⊢-⊣×+⟜(⊑bA)⊸≤)us⊸≠⊸/¨i
  id←⍷(bA M˜w/c)⍒⊸⊏in⋄nv←+´bA M˜⊑¨id

  c↩(w∨¬l∨c M bW)/(vi+id⊐in)⌾(w⊸/)(vi+(≠id)+lu⊐lit)⌾(cl⊸/)c
  c/˜↩¬(≠↑1∾(c∊2‿4+⊑bB)∨⊢)⊸∧c M bS⋄c/˜↩¬(1↓1∾˜c∊3‿5+⊑bB)∧c M bS
  ti←(us=¯1⊸⊑¨i)(⊢+∧⟜(2⊸=))0⌈na⌊∘÷˜(⊑bA)-˜⊑¨i
  ic←(0⊸≤∧<⟜(≠id))c-vi⋄t←ti⌾(ic⊸/)(vi⌊c)⊏charRole
  c+↩5×c M 5≍˜⊑bI
  ⟨c,t,nv,(nv↓id)∾lu⟩
}

ReadNum←{
  n‿d‿p‿i←4↕⊸+⊑bN  # ¯.π∞
  Nat←+⟜(10⊸×)´∘⌽ -⟜(⊑bD)
  Int←(n=⊑)◶⟨Nat,-·Nat 1⊸↓⟩
  Dec←⊐⟜(<d)⊸(Nat∘↑ + ·(0<≠)◶⟨0,Nat÷10⋆≠⟩+⟜1⊸↓)
  Pos←(⊑p‿i⊐⊏)◶⟨π,∞,Dec⟩
  e←⊑𝕩⊐bA_e
  m←(n=⊑)◶⟨Pos,-·Pos 1⊸↓⟩e↑𝕩
  𝕩×⟜(10⋆·Int(e+1)↓⊣)˜⍟(e<≠𝕩)m
}
LitVal←(⊑("'"∾'"')⊐⊏)1,1,ReadNum


LEBv  {
  b128
  lb1𝕩
  o⍋⍋((¯1⊑⊢)-/(≠↑0∾⊢))(+`)1+l
  ol{f×𝕨(𝕨-1)(b(×f+|)∾𝕊(⌊÷b)(f/))(´f)𝕩}𝕩
}

Parse  {nvr𝕨
  g⍋+`p𝕩(¯12|-)bBbrp×𝕩M 2˜2+⊑bB
  sl1𝕩 M bLsr¯1(g)slsaslsr
  g˜gslr׬saop>0
  r+(sa<𝕩=1+⊑bB)(⊣∧¬∨=(`(1+↕)×))(¯1(g)3=r)1r
  rev⍋+`1+¯1g((¯1∾⊣)(⊣⍋⊏⊏˜-⊏˜)1(+`∾-∾˜))osl𝕩 M bS

  gffd+`revbr
  rev˜gffd˜gf
  𝕩˜revbvrevbrb/bv<0fi+`cbv>0

  FC-(≠↑0∾⊢)(c1)/·+`0
  H0<1↓FC=
  ft(01H+2×2H⌈2×3H)(0345+5+⊑bI)𝕩
  fscftspc
  r((1ft)(1+2)/↕4)(b)revr

  id/idm(0≤∧<nv)xv𝕩-viidxid𝕩sp/𝕩 M bI
  ad(`×𝕩 M bG)𝕩=⊑bG

  g⍋+`revp-brgrgrevsll1+2÷˜0(<-/>)grsr-sll/g𝕩=5+⊑bB
  g˜gsgrslgrgrev𝕩˜gr˜go˜grsi/grsr>sl
  giglgs
  s𝕩 M bSpssogrsla𝕩 M 2˜bG
  r-psaopr2fe(r1)1r=3
  tr(`ׯ1ps)fe
  matr<(𝕩=1+⊑bG)1fe
  roopa<1r=3os⌽↕(⊣-⌈`×)⌽¬romaat(⊢+1+⊏os)/a
  aagasn¯1⌽+`gi⊏-(≠↑0∾⊢)(↕≠𝕩)at-1r¯1¨(aa/)r
  tf(a(`(1+↕)×)ps)(⊢∧2(|<≤)ps(⊢-⌈`×)+`)¬ro
  opaop>10˜psa
  oa⌽/opafa/(1aa)<(tf∨¬tr)(ro1opa)<(r=1)op<¯1opa
  dyfa10˜(𝕩≠⊑bO)(trr0)ro<r=0
  n𝕩vi+nvcn/n𝕩¯1++´bCu∧⍷obcn𝕩
  lo(o/𝕩)=4+⊑bBll1+lo/1(↓--)(o1)/+`(s0)-(1o)ps1
  dr/s>o+`0lort/𝕩=2+⊑bB

  diddecidmadasnlcFC dec
  ig((¯1c/gf)d/⊏((𝕩)bgf)˜)idfi
  ig<(id)/(⍋+`(d∾-/˜d))(⍋⊏((d/)idx))ig
  uid(`×)(ig)id
  ii(ui(fifsc)-(`c×)¬+`dec)((spfi)3×2|ft)++(0)2+spxv
  idor3⥊<isidsp
  idbc21+isasn,(id-(fd)ui)0¨sp,ii

  bgi
  oridorg˜cn,cn,b,b,rt,dr,l,l,si,si,at,oa+1oaos,(dy×⊏os)+fa+dy
  bc0idbc0¨cn,uob,15¨b,1+↕≠b
  bcorbc0∾∾25¨rt,14¨dr,3+laa,ll,3+siaa,sll,(11-⊑bG)+a/ma+𝕩,5+oar,(⊢+9×10=)16+dy-7×fatr
  fs(ft⊏⥊32)¨((+`01+⌊1281bc)˜/1orbc0+rt)<¨lc+fsc
  LEBv bc25,u,fs
}

Compile{
  t,r,nVar,litsTokenize𝕩
  bc,u,blknVarr Parse t
  o(u-(vi+nVar-≠𝕨)×uvi)𝕨∾LitVal¨lits
  bc,o,blk
}