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

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

bFbMbCbSbGbBbLbObIbDbNbAbW⊔/≠¨charGroups
bA_e4bA
M(0≤∧≠>)-
vi+´¨9charGroups
charRole((vi-≠bI)↑/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←charSet⊐f/𝕩
  w←(≠↑0∾⊢)⊸<l←c M∾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←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+l
  ol{f×𝕨(𝕨-1)(b(×f+|)∾𝕊(⌊÷b)(f/))(´f)𝕩}𝕩
}

Parse  {nvr𝕨
  g⍋+`pbB((¯12|⊢))𝕩brp×𝕩 M 23bB
  sl1𝕩 M bLsr¯1(g)slsaslsr
  g˜gslr׬saop>0
  r+(sa<𝕩=1bB)(⊣∧¬∨=(`(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𝕩 M (5bI)+⊢
  ft0(H↕3)+2×(H⥊3)2×H⥊4
  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𝕩=5bB
  g˜gsgrslgrgrev𝕩˜gr˜go˜grsi/grsr>sl
  giglgs
  s𝕩 M bSpssogrsla𝕩 M 2bG
  r-psaopr2fe(r1)1r=3
  tr(`ׯ1ps)fe
  matr<(𝕩=1bG)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𝕩¯1bCu∧⍷obcn𝕩
  lo(o/𝕩)=4bBll1+lo/1(↓--)(o1)/+`(s0)-(1o)ps1
  dr/s>o+`0lort/𝕩=2bB

  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
}