aboutsummaryrefslogtreecommitdiff
path: root/nc.bqn
blob: 9d5dc316b34c24825c7354ee5c8992275b37eb55 (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
#!/usr/bin/env bqn

⍝ This version of the compiler uses the old BQN prototype and is no
⍝ longer in development. See c.bqn instead.

reduce←{r←𝕩⋄{(>𝔽¨_r)⍠(><⊸(𝔽¨_r))}}βŠ‘βŸ¨Β΄βŸ©
´↩_reduce
βŠ”β†©((↕1+⌈´)=Β¨<)∘⊣ /¨⟜< β†•βˆ˜β‰ β βŠ’
⍷↩βˆͺ

Base←{+⟜(π•¨βŠΈΓ—)Β΄βŒ½π•©}
Enc2←{𝕨β₯Š2(|∾˜(𝕨-1)Enc2⌊∘÷˜)⍟(0<𝕨)𝕩}

lfβ€Ώtab←‒UCS 10β€Ώ9
charSetβ†βˆΎcharGroupsβ†βŸ¨
  chF←"+-Γ—Γ·β‹†βˆšβŒŠβŒˆ|¬∧∨<>β‰ =≀β‰₯β‰‘β‰’βŠ£βŠ’β₯ŠβˆΎβ‰β†‘β†“β†•βŒ½β‰/β‹β’βŠβŠ‘βŠβŠ’βˆŠβ·βŠ”" ⍝ Function
  "˜˘¨⌜⁼´`"             ⍝ Modifier
  "βˆ˜β—‹βŠΈβŸœβŒΎβŠ˜β—ΆβŽ‰βš‡βŸ"          ⍝ Composition
  "π•¨π•Žπ•©π•π•—π”½π•˜π”Ύ"            ⍝ Input
  lf∾"β‹„,"               ⍝ Separator
  "←↩→"                 ⍝ Gets
  "(){}⟨⟩"              ⍝ Bracket
  "β€Ώ"                   ⍝ Ligature
  β€’d ⍝ +⟜(↕10)βŒΎβ€’UCS'0'  ⍝ Digit
  "Β―.Ο€βˆž"                ⍝ Numeric
  "_"∾' '(⊒∾+)βŒΎβ€’UCSβ€’a   ⍝ Alphabetic
  " "∾tab               ⍝ Whitespace
⍝ #'" eliminated during tokenization
⟩
bFβ€ΏbMβ€ΏbCβ€ΏbIβ€ΏbSβ€ΏbGβ€ΏbBβ€ΏbLβ€ΏbDβ€ΏbNβ€ΏbAβ€ΏbWβ†βŠ”/β‰ Β¨charGroups
vi←+Β΄β‰ Β¨8↑charGroups

Tokenize←{
  r←𝕩='#'β‹„s←/(≠↑2βŠΈβ†“)βŠΈβˆ§π•©=βŠ‘"'"β‹„d←/𝕩='"'
  g←⍋qβ†βˆΎβŸ¨  sβ‹„Β―1↓dβ‹„/r⟩ β‹„q↩g⊏q
  e← g⊏∾⟨2+sβ‹„ 1↓dβ‹„(⊒-Β―1↓0∾⊒)∘⊏⟜(0∾+`r)⊸//(𝕩=lf)∾1⟩
  Se←{(βŠΛœπ•¨)Se 1¨⌾((𝕩/𝕨)⊸⊏)𝕩}⍟{0=βŠ‘βŒ½π•©}
  st←¯1↓Se⟜(1β†‘Λœβ‰ )βˆΎβŸœβ‰ q⍋eβ‹„b←st/q∾˘e
  ToI←(≠𝕩)↑/⁼∘β₯Šβ‹„f←¬≠`ToI b
  cb←(Β¬(st/q)⊏r)/b
  nl←≠lu←⍷litβ†π•©βŠ”Λœ1-˜(+`ToIβŠ‘Λ˜cb)Γ—β‰ `ToI cb
  cl←f/ToIβŠ‘βˆ˜βŒ½Λ˜cb
  args←charSetβŠΈβŠΒ¨π•¨β‹„c←charSet⊐f/𝕩
  w←(<´≠↕0∾⊒)l←c∊∾bDβ€ΏbNβ€ΏbA
  id←⍷args∾(bA∊˜w/c)β’βŠΈβŠi←(1-˜lΓ—+`w)βŠ”c
  nv←+Β΄bAβˆŠΛœβŠ‘Β¨id
  c↩(w∨¬l∨c∊bW)/(vi+id⊐i)⌾(w⊸/)(vi+(β‰ id)+lu⊐lit)⌾(cl⊸/)c
  c(/˜)↩¬(1βŒΎβŠ‘1⌽1βŒΎβŠ‘)⊸∧c∊bS
  ⟨c,nv,nv-β‰ args,(nv↓id)∾lu⟩
}

Parse←{
  aβ†π•©βˆŠ(2↑bG)β‹„at←1⌽a⋄𝕩(/˜)↩¬aβ‹„a(/˜)↩¬at
  l←≠𝕩⋄sepβ†π•©βˆŠbS⋄𝕩↩(bFβŠ‘ΛœchF⊐<'⊣')¨⌾(sep⊸/)𝕩⋄sepβˆ¨β†©π•©=2βŠ‘bB
  o←𝕩=0βŠ‘bBβ‹„c←𝕩=1βŠ‘bBβ‹„v←a-Λœπ•©β‰₯viβ‹„f←¬o∨c∨v∨sep
  na←(2Γ—sep)+fΓ—1+l↑0∾c∨v
  d←+`o-cβ‹„fe←(+`⌾((⍋d)⊸⊏)o)⊏l∾(β‹βŠβŸœd)⊸⊏/c
  feβŒŠβ†©l-l↑(⌈`β†•βˆ˜β‰ βŠΈΓ—)⌾⌽1∾˜sep
  selβ†Β¬βˆ˜βŠβŸœ(o∨c)⊸/⍋((fΓ—fe)βŒˆβ†•l)-+`f-l↑/⁼∧f/fe
  selβŠΈβŠΒ¨π•©β€Ώna
}

Hex←16 Base (β€’d∾"ABCDEF")⊸⊐

ReadNum←10 Base bD⊸⊐
GenF64←{
  𝕩=0:8β₯Š0
  l←2(βŒŠβ‹†βΌ)𝕩
  (Hex"44")∾2 Base˘⌽8β€Ώ8(⊣β₯ŠΓ—Β΄βŠΈβ†‘)∾⟨β₯Š0,11 Enc2 1023+l,(0⌈l)Enc2π•©βŸ©
}
MakeTab←{{(β‰ chF)β†‘βŠ‘Β¨(chFβŠπ•¨)βŠ”π•©}β—‹βˆΎβŸœ(β₯ŠΒ¨βˆ˜β₯ŠΒ¨)Β΄<Λ˜β‰(2(÷˜∾⊣)β‰’)⊸β₯Šπ•©}
tab1←MakeTab⟨
  "⊣⊒"     , 2β₯Š<⟨⟩
  "|-⌈⌊√"  , (Hex"99")+(↕4)∾6
  "÷"      , <(Hex"10")∾0
  "Β¬"      , <∾β₯ŠΒ¨βŸ¨Hex"9A",GenF64 1,Hex"A0"⟩
⟩
tab2←MakeTab⟨
  "⊣"      , Hex"1A"
  "+-Γ—Γ·βŒŠβŒˆβˆ§", (Hex"A0")+(↕6)∾2
  "Β¬"      , <∾β₯ŠΒ¨βŸ¨Hex"A1",GenF64 1,Hex"A0"⟩
  "∨"      , <(Hex"10")∾1
⟩
fntab←⍉¯3↑tab1≍tab2
f64←127-3

GenFn←{
  ⟨⟩GenFn𝕩;
  ⟨t,nVar,nLoc,litsβŸ©β†π•¨Tokenize𝕩
  t(⊏˜)↩⍋+`-Β΄<˘(2β€Ώ3⊏bB)=⌜t
  nd←+Β΄c←t=3βŠ‘bB
  t↩((vi+nVar+β‰ lits)+β†•βˆ˜β‰ )⌾(c⊸/)t
  ⟨a,naβŸ©β†Parse t
  ops←β₯ŠβˆΎβŸ¨
    vi↑fntab
    ⍉3↑(HexΒ¨"20"β€Ώ"22")βˆΎβŒœβ†•nVar
    ⊣⌜⟜(↕3)(GenF64∘ReadNumΒ¨lits)∾(Hex"10")∾¨3+↕nd
  ⟩
  (((β‰ βˆΎβˆΎ)⟨nLoc∾f64⟩)∾(Hex"0B")∾˜∾)Β¨((⊒-ΛœΒ¬Γ—+`)a=2βŠ‘bB)βŠ”(na+3Γ—a)⊏ops
}

Gen←{
  LEB←{0≑𝕩:β₯Š0β‹„128⊸+⌾(Β―1βŠΈβ†“) 2 Base βŒ½β‰ (∨`⌾⌽∨´˘)⊸/ 10β€Ώ7(⊣β₯ŠΓ—Β΄βŠΈβ†‘) ⌽64 Enc2 𝕩}
  C←LEBβˆ˜β‰ βŠΈβˆΎ
  Sβ†βˆΎβŸœC
  Vβ†β‰ βˆΎβˆΎ
  I←Cβˆ˜β€’UCS
  tβ€Ώnβ€Ώb←𝕩
  ∾⟨
   0∾(β€’UCS"asm")∾4↑1
   1 S V (96∾⟜∾C¨)¨t
   3 S V β₯ŠΒ¨β†•β‰ b
   7 S V β₯Š<"fn"I⊸(⊣∾0∾⊒)n
  10 S V C¨ b
  ⟩
}

Compile←{
  body←GenFn 𝕩
  rcpβ†βŸ¨"x"⟩ GenFn "1Γ·x"
  orβ†βŸ¨"w","x"⟩ GenFn "(w+x)-w∧x"
  fβ†βŸ¨rcp,or,body⟩
  Gen ⟨(β‰ Β¨f)/⟨1β€Ώ1,2β€Ώ1,0β€Ώ1⟩/¨¨f64 β‹„ 2 β‹„ ∾f⟩
}