#!/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 ← •LNS "src/r.bqn" X←Raw←{F:≤4} {v: 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∾¨'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) ∾ " ← " ∾ 𝕩} ⍎¨ ⟨ "IsArray ← 0≠≡" "Type ← ⊑⟨⟩⥊0⊸⥊" "Log ← ⋆⁼" "GroupLen← ≠¨⊔" "GroupOrd← ∾⊔∘⊢" '!' Mod "{𝕩 ⋄ ≤1}⍟(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←≠`𝕩='"' ⋄ q∨↩≠`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¨ impl Raw↩⍎ ExecFile←{Raw ∾ ∾⟜lf¨ E_proc¨ •LNS 𝕩} X↩Raw∘E_proc ⍎ ∾ ∾⟜lf¨ pre ≠◶X‿{ExecFile ⊑𝕩}‿{ExecFile ⊑𝕩 ⋄ X 1⊑𝕩} •args }