blob: 1106bf7fdccda3310c2a2b5a4705e96fe003275a (
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
|
#!/usr/bin/env dbqn
impl ← "
#⌜
# LAYER 4: Operators
_ranks ← {⟨2⟩⊘⟨1,0⟩((⊣-1+|)˜⟜≠⊑¨<∘⊢)⥊∘𝔽}
_depthOp_←{
neg←0>n←𝕨𝔾_ranks𝕩 ⋄ F←𝔽
_d←{
R←(𝕗+neg)_d
𝕨(2⥊(neg∧𝕗≥0)∨(0⌈𝕗)≥≍○<○≡)◶(⟨R¨⋄R⟜𝕩¨∘⊣⟩≍⟨(𝕨R⊢)¨∘⊢⋄F⟩)𝕩
}
𝕨 n _d 𝕩
}
⚇ ← _depthOp_
#⌜
# LAYER 5: Structural functions
Nat←IsArray◶⟨0⊸≤∧⌊⊸=,0⟩
Windows←{
! IsArray 𝕩
! 1≥=𝕨
! 𝕨≤○≠≢𝕩
! ∧´Nat¨⥊𝕨
s←(≠𝕨)↑≢𝕩
! ∧´𝕨≤1+s
𝕨{(∾⟜(𝕨≠⊸↓≢𝕩)∘≢⥊>)<¨⊸⊏⟜𝕩¨s(¬+⌜○↕⊢)⥊𝕨}⍟(0<≠𝕨)𝕩
}
↕ ↩ ↕ ⊘ Windows
#⌜
# LAYER 6: Everything else
# Searching
IndexOf←(1<⌈○=)◶⊐‿{
c←1-˜=𝕨
! 0≤c
𝕨 (0<≠𝕨)◶⟨0⎉c∘⊢,(+˝∧`)≢⎉c⎉c‿∞⟩ 𝕩
}
UniqueMask←{
! 1≤=𝕩
u←0↑𝕩
{(≠u)>⊑u IndexOf 𝕩}◶{u↩u∾𝕩⋄1}‿0˘𝕩
}
Find←{
r←=𝕨
! r≤=𝕩
𝕨 ≡⎉r (≢𝕨) ↕⎉r 𝕩
}
⊐ ← ⊐ ⊘ IndexOf
∊ ← UniqueMask ⊘ (⊐˜<≠∘⊢)
⍷ ← ∊⊸/ ⊘ Find
OccurrenceCount ← ⊐˜(⊢-⊏)⍋∘⍋
ProgressiveIndexOf ← {𝕨⊐○(≍˘⟜OccurrenceCount𝕨⊸⊐)𝕩}
⊒ ← OccurrenceCount⊘ ProgressiveIndexOf
"
raw ← {⍎}
X ← {F:≤4}
_withRef ← ˙
{v:
chrs←⟨
"↕⊐⊒∊⍷"
""
"⚇"
⟩
nc ← ≠¨chrs
chr ← ∾chrs
itr ← 0⥊˜≠chr
init ← " "⊸∾¨(/⟜"_"¨nc/0‿1‿1)∾¨(nc/"FMD")∾¨(nc+´⊸↑⥊"AB"∾⌜•a)
post ← ∾⟜" "¨/⟜"_"¨nc/0‿0‿1
names ← init∾¨'0'∾¨post
Inc ← {
i←⊑chr⊐𝕩
n←0 ⋄ itr↩{n↩1+𝕩}⌾(i⊑⊢)itr
names↩((i⊑init)∾('0'+n)∾i⊑post)⌾(i⊑⊢)names
}
# built-in assumptions
Mod ← {((⊑chr⊐𝕨)⊑names) ∾ " ← " ∾ 𝕩}
Raw¨ ⟨
"IsArray ← 0≠≡"
⟩∾Mod⟜⥊¨ "↕⊐"
chr∾↩"⍎" ⋄ names∾↩⟨"⍎_withRef "⟩
# checks if line is a builtin redefinition
E_isdef ← (3≤≠)◶⟨0,∧´⟨chr," ","←↩"⟩∊˜¨3⊸↑⟩
# removes comments and replaces built-ins with names
E_proc ← {
l←≠chr
q←≠`𝕩∊"""'" ⋄ f←¬∨`q¬⊸∧𝕩='#'
∾ (((l×f/q)+chr⊸⊐) (≥⟜l)◶⟨⊑⟜names,⥊∘⊢⟩¨ ⊢) f/𝕩
}
E_redef ← { # handles [fmd] [←↩]
tail ← E_proc 3↓𝕩 # must use old def
Inc ⊑𝕩
(E_proc 1↑𝕩) ∾ "←" ∾ tail
}
lf ← @+10
pre ← E_isdef◶E_proc‿E_redef¨ lf((⊢-˜¬×+`)∘=⊔⊢)impl
ExecFile←{
path ← "dot_path←" ∾ '"' (⊣∾⊣∾˜(1+=)/⊢) (∨`⌾⌽'/'=𝕩)/𝕩
src ← "•path"•_r_"dot_path"∘E_proc¨ •LNS 𝕩
Raw ∾ ∾⟜lf¨ path <⊸∾ src
}
X↩Raw∘E_proc
_withRef ↩ {𝕗∘E_proc}
Raw ∾ ∾⟜lf¨ pre
≠◶(X˙)‿{ExecFile ⊑𝕩}‿{ExecFile ⊑𝕩 ⋄ X 1⊑𝕩} •args
}
|