diff options
| author | Marshall Lochbaum <mwlochbaum@gmail.com> | 2020-06-29 14:08:03 -0400 |
|---|---|---|
| committer | Marshall Lochbaum <mwlochbaum@gmail.com> | 2020-06-29 14:08:03 -0400 |
| commit | c689914c958fe6ec978ff1996a216cbd3f7313d9 (patch) | |
| tree | bbd9fd37e8db6a21d17115655c959d602fa5f180 /spec | |
| parent | 241bee948b39b36bc6449906130efdf357adf89c (diff) | |
dzaima/reference BQN executable
Diffstat (limited to 'spec')
| -rwxr-xr-x | spec/dzref | 442 |
1 files changed, 442 insertions, 0 deletions
diff --git a/spec/dzref b/spec/dzref new file mode 100755 index 00000000..4a4849f1 --- /dev/null +++ b/spec/dzref @@ -0,0 +1,442 @@ +#!/usr/bin/env dbqn + +impl ← "◶ ← {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} ⍝ LIMITED to number left operand result +⊘ ← {𝕨((1{𝔽}𝕨)-0)◶𝔽‿𝔾 𝕩} +⊢ ← {𝕩} +⊣ ← {𝕩}⊘{𝕨} +˜ ← {𝕩𝔽𝕨⊣𝕩} +∘ ← {𝔽𝕨𝔾𝕩} +○ ← {(𝔾𝕨)𝔽𝔾𝕩} +⊸ ← {(𝔽𝕨⊣𝕩)𝔾𝕩} ⍝ {(𝔽{(F𝕨)G𝕩}𝔾)˜˜} ⍝ {F←𝔽 ⋄ G←𝔾 ⋄ {(F𝕨)G𝕩}˜˜} ⍝ {(𝔽𝕨)𝔾𝕩}˜˜ +⟜ ← {(𝕨⊣𝕩)𝔽𝔾𝕩} ⍝ {(𝔽{𝕨𝔽𝔾𝕩}𝔾)˜˜} ⍝ {F←𝔽 ⋄ G←𝔾 ⋄ {𝕨F G𝕩}˜˜} ⍝ {𝕨𝔽𝔾𝕩}˜˜ + +⍝ 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 𝕩 +_reduce←{ + ! 1=≠≢𝕩 + l←≠v←𝕩 ⋄ F←𝔽 + r←𝕨 (0<l)◶{𝕩⋄Identity f}‿{l↩l-1⋄l⊑𝕩}⊘⊣ 𝕩 + {r↩(𝕩⊑v)F r}¨(l-1)⊸-¨↕l + r +} +´ ← _reduce + + +⍝⌜ +⍝ 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 ← {⟨𝕩⟩} ⊘ {⟨𝕨,𝕩⟩} + +Unbox←(0<≠∘⥊)◶⊢‿{ + c←≢⊑𝕩 + ! ∧´⥊(c≡≢)¨𝕩 + 𝕩⊑⟜ToArray˜⌜↕c +} +> ↩ Unbox ⊘ > +_ranks ← {⟨2⟩⊘⟨1,0⟩((⊣-1+|)˜⟜≠⊑¨<∘⊢)⥊∘𝔽} +_depthOp_←{ + neg←0>n←𝕨𝔾_ranks𝕩 ⋄ F←𝔽 + _d←{𝕨(∧´(neg∧𝕗≥0)∨(0⌈𝕗)≥Pair○≡)◶⟨(𝕗+neg)_d¨⋄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 +_iterate_←{ + n←𝕨𝔾𝕩 + F←𝕨(0⊘1)◶⟨𝔽,𝕨𝔽⊢⟩⊢ + 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 +} + +≍ ← >∘Pair +⎉ ← _rankOp_ +⍟ ← _iterate_ +˘ ← ⎉¯1 + + +⍝⌜ +⍝ 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←(a-k)+⟜(↕a-1)⊸⊏¨s + ! ≡´c + l←+´(a=k)⊣◶1‿(⊑⊢)¨s + (⟨l⟩∾⊑c)⥊𝕨∾○⥊𝕩 +} + +Take←{ + T←{ + ! Int 𝕨 + l←≠𝕩 + i←((𝕨<0)×𝕨+l)+↕|𝕨 + ((l+1)|¯1⌈l⌊i)⊏𝕩 JoinTo (1 Cell 𝕩)⥊Type 𝕩 + } + 𝕨 T _onAxes_ 0 (⟨1⟩⥊˜0⌈𝕨-○≠⊢)⊸∾∘≢⊸⥊𝕩 +} +Prefixes ← {!1≤≠≢𝕩 ⋄ (↕1+≠𝕩)Take¨<𝕩} +↑ ← Prefixes ⊘ Take +Drop←{ + s←(≠𝕨)(⊣↑⊢∾⥊˜0⌈-⟜≠)≢𝕩 + ((sׯ1⋆𝕨>0)+(-s)⌈s⌊𝕨)↑𝕩 +} +Suffixes ← {!1≤≠≢𝕩 ⋄ (↕1+≠𝕩)Drop¨<𝕩} + +Windows←{ + ! IsArray 𝕩 + ! 1≥≠≢𝕨 + ! 𝕨≤○≠≢𝕩 + ! ∧´Nat¨⥊𝕨 + s←(≠𝕨)↑≢𝕩 + ! ∧´𝕨≤s + ><¨⊸⊏⟜𝕩¨s(¬+⌜○↕⊢)⥊𝕨 +} + +Reverse ← {!1≤≠≢𝕩 ⋄ (-↕⊸¬≠𝕩)⊏𝕩} +Rotate ← {!Nat𝕨 ⋄ l←≠𝕩⋄(l|𝕨+↕l)⊏𝕩} _onAxes_ 0 + +Indices←{ + ! 1=≠≢𝕩 + ! ∧´Nat¨𝕩 + ⟨⟩∾´𝕩⥊¨↕≠𝕩 +} +Rep ← Indices⊸⊏ +Replicate ← {0<≠≢𝕨}◶(⥊˜⟜≠Rep⊢)‿{!𝕨=○≠𝕩⋄𝕨Rep𝕩} _onAxes_ (1-0=≠) + +↓ ← Suffixes ⊘ Drop +↕ ↩ ↕ ⊘ Windows +⌽ ← Reverse ⊘ Rotate +/ ← Indices ⊘ Replicate + + +⍝⌜ +⍝ LAYER 6: Everything else + + +Join←{ + C←(<⟨⟩)⥊⊸∾⌜´⊢ ⍝ Cartesian array product + ! IsArray 𝕩 + s←≢¨𝕩 + c←≠⊑s + ! ∧´c=≠¨s + ! c≥≠≢𝕩 + l←(≢𝕩){(𝕩⊑a⊑˜(j=𝕩)⊸×)¨↕𝕨}¨j←↕≠≢a←𝕩 + ! 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+0⌈´⚇1𝕨 +} + +ReorderAxes←{ + 𝕩↩<⍟(0=≡)𝕩 + ! 𝕨≤○≠≢𝕩 + r←(≠≢𝕩)-+´¬∊𝕨 + ! ∧´𝕨<r + 𝕨↩𝕨∾𝕨(¬∘∊˜/⊢)↕r + (𝕨⊸⊏⊑𝕩˜)¨↕1×´¨𝕨⊔≢𝕩 +} +Transpose←(≠∘≢-1˜)⊸ReorderAxes⍟(0<≠∘≢) + +∾ ↩ Join ⊘ JoinTo +⊔ ← ⊔⟜(↕∘≠⚇1) ⊘ Group +⍉ ← Transpose ⊘ ReorderAxes + +⍝ Searching +IndexOf←{ + c←1-˜≠≢𝕨 + ! 0≤c + 𝕨 (0<≠𝕨)◶⟨0⎉c∘⊢,((+´<˘)∧`)≢⎉c⎉∞‿c⟩ 𝕩 +} +UniqueMask←{ + ! 1≤≠≢𝕩 + u←0↑𝕩 + {𝕩∊u}⊘{u↩u∾𝕩⋄1}‿0˘𝕩 +} +Find←{ + r←≠s←≢𝕨 + 𝕨≡⎉r s↕⎉r 𝕩 +} + +⊐ ← !∘0 ⊘ IndexOf +∊ ← UniqueMask ⊘ (⊐˜<≠∘⊢) +⍷ ← ∊⊸/ ⊘ Find + +⍝ Sorting +Cmp ← ∨○IsArray◶{ ⍝ No arrays + 𝕨(>-<)𝕩 ⍝ Assume they're numbers +}‿{ ⍝ At least one array + e←𝕨-˜○(0∨´0=≢)𝕩 + 𝕨(e=0)◶e‿{ + c←𝕨×∘-○(IsArray+≠∘≢)𝕩 + s←≢𝕨 ⋄ t←≢𝕩 ⋄ r←s⌊○≠t + 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⊐+´˘(𝔽⎉∞‿¯1⎉¯1‿∞˜𝕩)(⌈⟜0+=⟜0⊸×)>⌜˜i←↕≠𝕩 +} +_bins←{ + r←1-˜≠≢𝕨 + ! 0≤r + LE←0≤𝔽⎉r + ! ∧´LE´˘2↕<˘𝕩 + +´𝕨LE⎉¯1‿∞𝕩 +} + +OccurrenceCount ← ⊐˜(⊢-⊏)⍋∘⍋ +ProgressiveIndexOf ← {𝕨⊐○(≍˘⟜OccurrenceCount𝕨⊸⊐)𝕩} + +⍋ ← Cmp _grade ⊘ ( Cmp _bins) +⍒ ← -∘Cmp _grade ⊘ (-∘Cmp _bins) +∧ ↩ ⍋⊸⊏ ⊘ ∧ +∨ ↩ ⍒⊸⊏ ⊘ ∨ +⊒ ← OccurrenceCount⊘ ProgressiveIndexOf +" + +{ + names ← ⥊"AB"∾⌜•a + f_chr ← "!+-×÷⋆√⌊⌈∧∨¬|=≠≤<>≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔" + m_chr ← "˜˘¨⌜⁼´`" + d_chr ← "∘⊸⟜○⌾⎉⚇⍟◶⊘" + + f_itr ← 0⥊˜≠f_chr + m_itr ← 0⥊˜≠m_chr + d_itr ← 0⥊˜≠d_chr + + Name_f ← {i←⊑f_chr⊐𝕩 ⋄ (i⊑names)∾'F'∾⊑•UCS 48+i⊑f_itr} + Name_m ← {i←⊑m_chr⊐𝕩 ⋄ '_'∾(i⊑names)∾'M'∾⊑•UCS 48+i⊑m_itr} + Name_d ← {i←⊑d_chr⊐𝕩 ⋄ "_"∾˜'_'∾(i⊑names)∾'D'∾⊑•UCS 48+i⊑d_itr} + + E_type ← {⊑/𝕩∊¨f_chr‿m_chr‿d_chr} + Name_a ← {E_type◶Name_f‿Name_m‿Name_d 𝕩} + + Inc_f ← {i←⊑f_chr⊐𝕩 ⋄ f_itr↩ 1⊸+⌾(i⊑⊢) f_itr} + Inc_m ← {i←⊑m_chr⊐𝕩 ⋄ m_itr↩ 1⊸+⌾(i⊑⊢) m_itr} + Inc_d ← {i←⊑d_chr⊐𝕩 ⋄ d_itr↩ 1⊸+⌾(i⊑⊢) d_itr} + + Inc_a ← {E_type◶Inc_f‿Inc_m‿Inc_d 𝕩} + + ⍝ starting built-ins + ⍎{𝔽 (Name_f 𝕩)∾"←{⟨𝕨 ⟩ ⋄ ⍎""Using undefined built-in "∾𝕩∾"""}"}¨ f_chr + ⍎{𝔽 (Name_m 𝕩)∾"←{⟨𝕨,𝕗⟩ ⋄ ⍎""Using undefined built-in "∾𝕩∾"""}"}¨ m_chr + ⍎{𝔽 (Name_d 𝕩)∾"←{⟨𝕨,𝕘⟩ ⋄ ⍎""Using undefined built-in "∾𝕩∾"""}"}¨ d_chr + + ⍝ built-in assumptions + + Mod_f ← ⍎{𝔽 (Name_f 𝕨) ∾ " ↩ " ∾ 𝕩} + Mod_m ← ⍎{𝔽 (Name_m 𝕨) ∾ " ↩ " ∾ 𝕩} + + '+' Mod_f "+" + '-' Mod_f "-" + '×' Mod_f "×" + '÷' Mod_f "÷" + '⋆' Mod_f "⋆" + '⌊' Mod_f "⌊" + '=' Mod_f "=" + '≤' Mod_f "≤" + + + ⍎"IsArray ← 0≠≡" + ⍎"_amend ← {𝕨{𝕩⋄𝕗}⌾(𝕗⊑⊢)𝕩}" + ⍎"Identity← {𝕏´⟨⟩}" + ⍎"Type ← ⟨⟩⥊0⊸⥊" + + '!' Mod_f "{𝕩 ⋄ ≤1}⍟¬" + '≢' Mod_f "≢" + '⥊' Mod_f "⥊" + '⊑' Mod_f "⊑" + '↕' Mod_f "↕" + '⁼' Mod_m "⁼" + + + E_isdef ← ⊢ ≢ ("^["∾f_chr∾m_chr∾d_chr∾"] [←↩]")•_R_'_' ⍝ checks if line is a builtin redefinition + + E_proc ← { ⍝ replaces built-ins with their corresponding names + curr ← 𝕩 + {curr↩ ("["∾𝕩∾"]") •_R_ (' '∾˜' '∾Name_a 𝕩) ⊢ curr}¨ f_chr∾m_chr∾d_chr + curr + } + + E_redef ← { ⍝ handles [fmd] [←↩] + ⍝e_prs∾↩ 𝕩 ∾ •UCS 10 + tail ← E_proc 3↓𝕩 ⍝ must use old def + Inc_a ⊑𝕩 + (E_proc⊑𝕩) ∾ "←" ∾ tail + } + + lf ← •UCS 10 + pre ← E_isdef◶E_proc‿E_redef¨ lf((⊢-˜¬×+`)∘=⊔⊢)impl + ⍎ ∾´ ∾⟜lf¨ pre ∾ E_proc¨ •STDIN⟨⟩ +}0 |
