aboutsummaryrefslogtreecommitdiff
path: root/dzref
blob: 7038e77e149aa6a792897435a1497ecda037a5b7 (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
#!/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/011)∾¨(nc/"FMD")∾¨(nc+´⊸↑⥊"AB"∾⌜•a)
  post  ∾⟜" "¨/"_"¨nc/001
  names  init∾¨'0'∾¨post

  Inc  {
    i←⊑chr𝕩
    n0  itr↩{n1+𝕩}⌾(i⊑⊢)itr
    names((iinit)('0'+n)ipost)(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(𝕩=lf)≥○(↕∘≠⊸(⌈`×))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_isdefE_procE_redef¨ lf((-˜¬×+`)=⊔⊢)impl
  ExecFile←{
    src  E_proc¨ LNS 𝕩
    ⟨⟨⟩,"",(∨`⌾⌽'/'=𝕩)/𝕩 Raw  ∾⟜lf¨ src
  }
  _withRef  {𝔽E_proc(𝔽E_proc)}
  XRaw _withRef
  Raw  ∾⟜lf¨ pre
  ≠◶(X˙)‿{ExecFile 𝕩}‿{ExecFile 𝕩  X 1𝕩} args
}