aboutsummaryrefslogtreecommitdiff
path: root/dzref_full
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2020-07-25 20:56:56 -0400
committerMarshall Lochbaum <mwlochbaum@gmail.com>2020-07-25 22:03:30 -0400
commita34e6e72b375483028c81283015af74a67dd0e98 (patch)
tree44de936575f93c04410c080d7aa4c8230d889354 /dzref_full
parentd4ae9cd4b1688020af6099d9abae83af2b956ed9 (diff)
Add dzref_full with all reference implementations
Diffstat (limited to 'dzref_full')
-rwxr-xr-xdzref_full445
1 files changed, 445 insertions, 0 deletions
diff --git a/dzref_full b/dzref_full
new file mode 100755
index 00000000..fca51993
--- /dev/null
+++ b/dzref_full
@@ -0,0 +1,445 @@
+#!/usr/bin/env dbqn
+
+# This version of dzref defines every primitive that spec/reference.bqn
+# does. It's intended to test out these implementations for use in the
+# BQN runtime; use plain dzref if you just want to run BQN as it's much
+# faster and supports inverses better.
+
+impl ← "◶ ← {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # LIMITED to number left operand result
+⊘ ← {𝕨((1{𝔽}𝕨)-0)◶𝔽‿𝔾 𝕩}
+⊢ ← {𝕩}
+⊣ ← {𝕩}⊘{𝕨}
+˜ ← {𝕩𝔽𝕨⊣𝕩}
+∘ ← {𝔽𝕨𝔾𝕩}
+○ ← {(𝔾𝕨)𝔽𝔾𝕩}
+⊸ ← {(𝔽𝕨⊣𝕩)𝔾𝕩}
+⟜ ← {(𝕨⊣𝕩)𝔽𝔾𝕩}
+
+# LIMITED to numeric arguments for scalar cases
+√ ← ⋆⟜(÷2) ⊘ (⋆⟜÷˜)
+∧ ← ×
+∨ ← (+-×)
+¬ ← 1+-
+< ← {⟨⟩⥊⟨𝕩⟩} ⊘ (¬≤˜)
+> ← (¬≤)
+≥ ← !∘0 ⊘ (≤˜)
+≢ ↩ IsArray◶⟨⟩‿≢ # LIMITED to monadic case
+Length ← (0<0⊑≢)◶⟨1⋄0⊑⊢⟩∘≢
+≠ ← Length ⊘ (¬∘=)
+× ↩ 0⊸(<->) ⊘ ×
+| ← ×⟜× ⊘ {𝕩-𝕨×⌊𝕩÷𝕨}
+
+_eachm←{
+ r←⥊𝕩 ⋄ F←𝔽
+ E←(≠r)⊸≤◶{r↩r𝕩_amend˜F𝕩⊑r⋄E𝕩+1}‿⊢
+ E 0 ⋄ (≢𝕩)⥊r
+}
+¨ ← _eachm # LIMITED to monadic case and array 𝕩
+_fold←{
+ ! 1==𝕩
+ l←≠v←𝕩 ⋄ F←𝔽
+ r←𝕨 (0<l)◶{𝕩⋄Identity f}‿{l↩l-1⋄l⊑𝕩}⊘⊣ 𝕩
+ {r↩(𝕩⊑v)F r}¨(l-1)⊸-¨↕l
+ r
+}
+´ ← _fold
+
+
+#⌜
+# LAYER 2: Pervasion
+# After defining _perv, we apply it to all scalar functions,
+# making them pervasive. I'm not going to write that out.
+
+ToArray ← IsArray◶<‿⊢
+
+∾ ← {k←≠𝕨⋄k⊸≤◶⟨⊑⟜𝕨⋄-⟜k⊑𝕩˜⟩¨↕k+≠𝕩} # LIMITED to two vector arguments
+
+_table←{
+ m←≠a←⥊𝕨 ⋄ n←≠b←⥊𝕩 ⋄ F←𝔽
+ r←↕m×n
+ {𝕩⊸{r↩r((n×𝕨)+𝕩)_amend˜(𝕨⊑a)F(𝕩⊑b)}¨↕n}¨↕m
+ (𝕨∾○≢𝕩)⥊r
+}
+
+_eachd←{
+ _e←{ # 𝕨 has smaller or equal rank
+ k←≠p←≢𝕨 ⋄ q←≢𝕩
+ ! ∧´(⊑⟜p=⊑⟜q)¨↕k
+ l←1×´(q⊑˜k⊸+)¨↕q≠⊸-k
+ a←⥊𝕨 ⋄ b←⥊𝕩
+ q⥊⥊(≠a) (⊑⟜a𝔽l⊸×⊸+⊑b˜)_table○↕ l
+ }
+ (>○=)◶⟨𝔽_e⋄𝔽˜_e˜⟩
+}
+
+⌜ ← {(𝔽_eachm)⊘(𝔽_table)○ToArray}
+¨ ↩ {(𝔽_eachm)⊘(𝔽_eachd)○ToArray}
+
+_perv←{ # Pervasion
+ (⊢⊘∨○IsArray)◶⟨𝔽⋄𝔽{𝕨𝔽_perv𝕩}¨⟩
+}
+⌊ ↩ ⌊ ⊘ {(𝕨>𝕩)⊑𝕨‿𝕩} _perv
+⌈ ← -∘⌊∘- ⊘ {(𝕨<𝕩)⊑𝕨‿𝕩} _perv
+
+
+#⌜
+# LAYER 3: Remove other limits
+# Now all implementations are full except ∾; ↕ is monadic only
+
+Int←IsArray◶⟨⌊⊸=,0⟩
+Nat←IsArray◶⟨0⊸≤∧⌊⊸=,0⟩
+
+Deshape←IsArray◶{⟨𝕩⟩}‿⥊
+Reshape←{
+ ! 1≥=𝕨
+ 𝕨↩⥊𝕨
+ ! ∧´Nat¨𝕨
+ n←≠𝕩 ⋄ l←1×´𝕨
+ ! n≤○(0⊸=)l
+ 𝕨⥊⊑⟜𝕩¨n|↕l
+}⟜Deshape
+⥊ ↩ Deshape ⊘ Reshape
+
+Range←{
+ I←{!Nat𝕩⋄↕𝕩}
+ M←{!1==𝕩⋄(<⟨⟩)⥊⊸∾⌜´I¨𝕩}
+ IsArray◶I‿M 𝕩
+}
+
+Pick1←{
+ ! 1==𝕨
+ ! 𝕨=○≠s←≢𝕩
+ ! ∧´Int¨𝕨
+ ! ∧´𝕨(≥⟜-∧<)s
+ 𝕨↩𝕨+s×𝕨<0
+ (⥊𝕩)⊑˜0(⊑⟜𝕨+⊑⟜s×⊢)´-↕⊸¬≠𝕨
+}
+Pickd←(0∨´⟜⥊IsArray¨∘⊣)◶Pick1‿{Pickd⟜𝕩¨𝕨}
+Pick←IsArray◶⥊‿⊢⊸Pickd
+
+match←{¬∘(0⊑𝕨)◶(1⊑𝕨)‿𝕩}´⟨
+ ⟨≠○IsArray , 0⟩
+ ⟨¬IsArray∘⊢, =⟩
+ ⟨≠○= , 0⟩
+ ⟨0∨´≠○≢ , 0⟩
+ {∧´⥊𝕨Match¨𝕩}
+⟩
+
+Depth←IsArray◶0‿{1+0⌈´Depth¨⥊𝕩}
+
+⊑ ↩ (0¨∘≢)⊸Pick ⊘ Pick
+↕ ↩ Range
+◶ ↩ {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # Same definition, new Pick
+
+≡ ← Depth ⊘ Match
+≢ ↩ ≢ ⊘ (¬Match)
+
+
+#⌜
+# LAYER 4: Operators
+
+
+DropV← {⊑⟜𝕩¨𝕨+↕𝕨-˜≠𝕩}
+Cell ← DropV⟜≢
+Pair ← {⟨𝕩⟩} ⊘ {⟨𝕨,𝕩⟩}
+
+Merge←(0<≠∘⥊)◶⊢‿{
+ c←≢⊑𝕩
+ ! ∧´⥊(c≡≢)¨𝕩
+ 𝕩⊑⟜ToArray˜⌜↕c
+}
+> ↩ Merge ⊘ >
+≍ ← >∘Pair
+_ranks ← {⟨2⟩⊘⟨1,0⟩((⊣-1+|)˜⟜≠⊑¨<∘⊢)⥊∘𝔽}
+_depthOp_←{
+ neg←0>n←𝕨𝔾_ranks𝕩 ⋄ F←𝔽
+ _d←{
+ R←(𝕗+neg)_d
+ 𝕨(2⥊(neg∧𝕗≥0)∨(0⌈𝕗)≥Pair○≡)◶(⟨R¨⋄R⟜𝕩¨∘⊣⟩≍⟨(𝕨R⊢)¨∘⊢⋄F⟩)𝕩
+ }
+ 𝕨 n _d 𝕩
+}
+⚇ ← _depthOp_
+_rankOp_←{
+ k←𝕨(Pair○= (0≤⊢)◶⟨⌊⟜-,0⌈-⟩¨ 𝔾_ranks)𝕩
+ Enc←{
+ f←⊑⟜(≢𝕩)¨↕𝕨
+ c←1×´s←𝕨Cell𝕩
+ f⥊⊑⟜(⥊𝕩)¨∘((s⥊↕c)+c×⊢)¨↕1×´f
+ }
+ > ((⊑k)Enc𝕨) 𝔽¨ ((1-˜≠)⊸⊑k)Enc𝕩
+}
+_scan←{
+ ! IsArray 𝕩
+ ! 1≤=𝕩
+ F←𝔽
+ (0<≠∘⥊)◶⊢‿{
+ r←⥊𝕩 ⋄ l←≠𝕩 ⋄ c←1×´1 Cell 𝕩
+ {r↩r𝕩_amend˜𝕨F○(⊑⟜r)𝕩}⟜(c⊸+)¨↕c-˜≠r
+ (≢𝕩)⥊r
+ }𝕩
+}
+` ← _scan
+_repeat_←{
+ n←𝕨𝔾𝕩
+ f←⊑𝕨⟨𝔽⟩⊘⟨𝕨𝔽⊢⟩𝕩
+ l←u←0
+ {!Int𝕩⋄l↩l⌊𝕩⋄u↩u⌈𝕩}⚇0 n
+ a←𝕩⋄_p←{𝔽∘⊣`(1+𝕩)⥊<a}
+ pos←F _p u ⋄ neg←F⁼_p-l
+ (|⊑<⟜0⊑pos‿neg˜)⚇0 n
+}
+
+⎉ ← _rankOp_
+⍟ ← _repeat_
+˘ ← ⎉¯1
+_insert←{
+ ! 1≤=𝕩
+ 𝕨 𝔽´ <˘𝕩
+}
+˝ ← _insert
+
+
+#⌜
+# LAYER 5: Structural functions
+
+_onAxes_←{
+ F←𝔽
+ (𝔾<≡)∘⊣◶{ # One axis
+ ! 1≤=𝕩
+ 𝕨F𝕩
+ }‿{ # Multiple axes
+ ! 1≥=𝕨
+ ! 𝕨≤○≠≢𝕩
+ R←{(⊑𝕨)F(1 DropV 𝕨)⊸R˘𝕩}⍟{0<≠𝕨}
+ 𝕨R𝕩
+ }
+}
+
+SelSub←{
+ ! IsArray 𝕨
+ ! ∧´⥊Int¨ 𝕨
+ ! ∧´⥊ 𝕨 (≥⟜-∧<) ≠𝕩
+ 𝕨↩𝕨+(≠𝕩)×𝕨<0
+ c←1×´s←1 Cell 𝕩
+ ⊑⟜(⥊𝕩)¨(c×𝕨)+⌜s⥊↕c
+}
+Select←ToArray⊸(SelSub _onAxes_ 1)
+⊏ ← 0⊸Select ⊘ Select
+
+JoinTo←{
+ s←𝕨Pair○≢𝕩
+ a←1⌈´k←≠¨s
+ ! ∧´1≥a-k
+ c←(k¬a)+⟜(↕a-1)⊸⊏¨s
+ ! ≡´c
+ l←+´(a=k)⊣◶1‿(⊑⊢)¨s
+ (⟨l⟩∾⊑c)⥊𝕨∾○⥊𝕩
+}
+
+Take←{
+ T←{
+ ! Int 𝕨
+ l←≠𝕩
+ i←(l+1)|¯1⌈l⌊((𝕨<0)×𝕨+l)+↕|𝕨
+ i⊏JoinTo⟜(1⊸Cell⥊Type)⍟(0∨´l=i)𝕩
+ }
+ 𝕨 T _onAxes_ 0 (⟨1⟩⥊˜0⌈𝕨-○≠⊢)⊸∾∘≢⊸⥊𝕩
+}
+Prefixes ← {!1≤=𝕩 ⋄ (↕1+≠𝕩)Take¨<𝕩}
+↑ ← Prefixes ⊘ Take
+Drop←{
+ s←(≠𝕨)(⊣↑⊢∾˜1⥊˜0⌈-⟜≠)≢𝕩
+ ((sׯ1⋆𝕨>0)+(-s)⌈s⌊𝕨)↑𝕩
+}
+Suffixes ← {!1≤=𝕩 ⋄ (↕1+≠𝕩)Drop¨<𝕩}
+↓ ← Suffixes ⊘ Drop
+
+Windows←{
+ ! IsArray 𝕩
+ ! 1≥=𝕨
+ ! 𝕨≤○≠≢𝕩
+ ! ∧´Nat¨⥊𝕨
+ s←(≠𝕨)↑≢𝕩
+ ! ∧´𝕨≤1+s
+ 𝕨{(∾⟜(𝕨≠⊸↓≢𝕩)∘≢⥊>)<¨⊸⊏⟜𝕩¨s(¬+⌜○↕⊢)⥊𝕨}⍟(0<≠𝕨)𝕩
+}
+
+Reverse ← {!1≤=𝕩 ⋄ (-↕⊸¬≠𝕩)⊏𝕩}
+Rotate ← {!Int𝕨 ⋄ l←≠𝕩⋄(l|𝕨+↕l)⊏𝕩} _onAxes_ 0
+
+Indices←{
+ ! 1==𝕩
+ ! ∧´Nat¨𝕩
+ ⟨⟩∾´𝕩⥊¨↕≠𝕩
+}
+Rep ← Indices⊸⊏
+Replicate ← {0<=𝕨}◶(⥊˜⟜≠Rep⊢)‿{!𝕨=○≠𝕩⋄𝕨Rep𝕩} _onAxes_ (1-0=≠)
+
+↕ ↩ ↕ ⊘ Windows
+⌽ ← Reverse ⊘ Rotate
+/ ← Indices ⊘ Replicate
+
+
+#⌜
+# LAYER 6: Everything else
+
+
+Join←{
+ C←(<⟨⟩)⥊⊸∾⌜´⊢ # Cartesian array product
+ ! IsArray 𝕩
+ s←≢¨𝕩
+ d←≠⊑s
+ ! ∧´⥊d=≠¨s
+ ! d≥=𝕩
+ l←(≢𝕩){(𝕩⊑⟜≢a⊑˜(j=𝕩)⊸×)¨↕𝕨}¨j←↕r←=a←𝕩
+ ! (r↑¨s)≡C l
+ i←C{p←+´¨↑𝕩⋄(↕⊑⌽p)-𝕩/¯1↓p}¨l
+ >i<¨⊸⊏¨l/𝕩
+}⍟(0<≠∘⥊)
+
+Group←{
+ ! IsArray 𝕩
+ Chk←{!1==𝕩⋄!∧´Int¨𝕩⋄!∧´¯1≤𝕩⋄≠𝕩}
+ l←(1<≡)◶Chk‿{!1==𝕩⋄Chk¨𝕩}𝕨
+ ! l≤○≠≢𝕩
+ ! ∧´l=l≠⊸↑≢𝕩
+ (𝕨⊸=/𝕩˜)¨↕1+¯1⌈´⚇1𝕨
+}
+
+∾ ↩ Join ⊘ JoinTo
+⊔ ← Group⟜(↕≠⚇1) ⊘ Group
+
+# Searching
+IndexOf←{
+ 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 𝕩
+}
+
+⊐ ← !∘0 ⊘ IndexOf
+∊ ← UniqueMask ⊘ (⊐˜<≠∘⊢)
+⍷ ← ∊⊸/ ⊘ Find
+
+ReorderAxes←{
+ 𝕩↩<⍟(0=≡)𝕩
+ ! 1≥=𝕨
+ 𝕨↩⥊𝕨
+ ! 𝕨≤○≠≢𝕩
+ ! ∧´Nat¨⥊𝕨
+ r←(=𝕩)-+´¬∊𝕨
+ ! ∧´𝕨<r
+ 𝕨↩𝕨∾𝕨(¬∘∊˜/⊢)↕r
+ (𝕨⊸⊏⊑𝕩˜)¨↕⌊´¨𝕨⊔≢𝕩
+}
+Transpose←(=-1˜)⊸ReorderAxes⍟(0<=)
+⍉ ← Transpose ⊘ ReorderAxes
+
+# Sorting
+Cmp ← ∨○IsArray◶{ # No arrays
+ 𝕨(>-<)𝕩 # Assume they're numbers
+}‿{ # At least one array
+ e←𝕨-˜○(0∨´0=≢)𝕩
+ 𝕨(e=0)◶e‿{
+ c←𝕨×∘-○(IsArray+=)𝕩
+ s←≢𝕨 ⋄ t←≢𝕩 ⋄ r←𝕨⌊○=𝕩
+ l←s{i←+´∧`𝕨=𝕩⋄m←1×´i↑𝕨⋄{c↩×-´𝕩⋄m↩m×⌊´𝕩}∘(⊑¨⟜𝕨‿𝕩)⍟(r⊸>)i⋄m}○(r↑⌽)t
+ a←⥊𝕨⋄b←⥊𝕩
+ Trav←(=⟜l)◶{Trav∘(1+𝕩)⍟(0⊸=)a Cmp○(𝕩⊸⊑)b}‿c
+ Trav 0
+ }𝕩
+}
+
+_grade←{
+ ! 1≤=𝕩
+ i⊐˜+´˘((2⥊≠𝕩)⥊𝔽⎉∞‿¯1⎉¯1‿∞˜𝕩)(⌈⟜0+=⟜0⊸×)>⌜˜i←↕≠𝕩
+}
+_bins←{
+ c←1-˜=𝕨
+ ! 0≤c
+ LE←𝔽⎉c≤0˜
+ ! (0<≠)◶⟨1,∧´·LE˝˘2↕⊢⟩𝕨
+ 𝕨 (0<≠𝕨)◶⟨0⎉c∘⊢,+˝LE⎉¯1‿∞⟩ 𝕩
+}
+
+OccurrenceCount ← ⊐˜(⊢-⊏)⍋∘⍋
+ProgressiveIndexOf ← {𝕨⊐○(≍˘⟜OccurrenceCount𝕨⊸⊐)𝕩}
+
+⍋ ← Cmp _grade ⊘ ( Cmp _bins)
+⍒ ← -∘Cmp _grade ⊘ (-∘Cmp _bins)
+∧ ↩ ⍋⊸⊏ ⊘ ∧
+∨ ↩ ⍒⊸⊏ ⊘ ∨
+⊒ ← OccurrenceCount⊘ ProgressiveIndexOf
+"
+
+X←Raw←{≤4}
+{
+ chrs←⟨
+ "!+-×÷⋆√⌊⌈∧∨¬|=≠≤<>≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔"
+ "˜˘¨⌜⁼´˝`"
+ "∘⊸⟜○⌾⎉⚇⍟◶⊘"
+ ⟩
+ nc ← ≠¨chrs
+ chr ← ∾chrs
+ itr ← 0⥊˜≠chr
+
+ init ← " "⊸∾¨(/⟜"_"¨nc/0‿1‿1)∾¨(nc/"FMD")∾¨(nc+´⊸↑⥊"ABC"∾⌜•a)
+ post ← ∾⟜" "¨/⟜"_"¨nc/0‿0‿1
+ names ← init∾¨(•UCS 48)∾¨post
+
+ Inc ← {
+ i←⊑chr⊐𝕩
+ n←0 ⋄ itr↩{n↩1+𝕩}⌾(i⊑⊢)itr
+ names↩((i⊑init)∾(•UCS 48+n)∾i⊑post)⌾(i⊑⊢)names
+ }
+
+ # starting built-ins
+ inps←⟨"𝕨 ","𝕨,𝕗","𝕨,𝕘"⟩
+ ⍎¨names∾¨(nc/("←{⟨"∾∾⟜"⟩ ⋄ ⍎""Using undefined built-in ")¨inps)∾¨∾⟜"""}"¨chr
+
+ # built-in assumptions
+ Mod ← ⍎{𝔽 ((⊑chr⊐𝕨)⊑names) ∾ " ↩ " ∾ 𝕩}
+
+ ⍎"IsArray ← 0≠≡"
+ ⍎"_amend ← {𝕨{𝕩⋄𝕗}⌾(𝕗⊑⊢)𝕩}"
+ ⍎"Identity← {𝕏´⟨⟩}"
+ ⍎"Type ← ⟨⟩⥊0⊸⥊"
+
+ '!' Mod "{𝕩 ⋄ ≤1}⍟¬"
+ Mod⟜⥊¨ "+-×÷⋆⌊=≤≢⥊⊑↕⁼"
+
+
+ # 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 ← •UCS 10
+ pre ← E_isdef◶E_proc‿E_redef¨ lf((⊢-˜¬×+`)∘=⊔⊢)impl
+ Raw↩⍎
+ ExecFile←{Raw ∾ ∾⟜lf¨ E_proc¨ •LNS 𝕩}
+ X↩Raw∘E_proc
+ ⍎ ∾ ∾⟜lf¨ pre
+ ≠◶X‿{ExecFile ⊑𝕩}‿{ExecFile ⊑𝕩 ⋄ X 1⊑𝕩} •args
+}0