lf←@+10 charSet‿cgl←(∾ ≍○< ≠¨)⟨ "+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!" # Function "˙˜˘¨⌜⁼´˝`" # Modifier "∘○⊸⟜⌾⊘◶⎉⚇⍟" # Composition lf∾"⋄," # Separator "←↩→" # Gets "(){}⟨⟩" # Bracket "‿" # Ligature "·" # nOthing # Use last character in case of UTF-16 (like dzaima/BQN) ¯1⊏˘10‿∘⥊"𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕗𝕘" # Input (𝕣 pending; ℝ not allowed) '0'+↕10 # Digit "π∞¯." # Numeric "_"∾˜⥊"aA"+⌜↕na←26 # Alphabetic (¯1↓"𝕨")∾" "∾@+9 # Whitespace (or special name prefix in UTF-16) "#'""@" # Preprocessed characters ⟩ ErrUnknownChars←{ ⟨"Unknown character","s"/˜1<≠𝕩,": ",𝕩⟩∾⊸!0 } CharCode←charSet{ Chk ← ⊢⊣ErrUnknownChars∘(≠/⊣)⍟≢⟜(⊏⟜𝕗) g←⍋𝕗 ⋄ ⊢ Chk g⊏˜1-˜1⌈(g⊏𝕗)⍋⊢ } bF‿bM‿bC‿bS‿bG‿bB‿bL‿bO‿bI‿bD‿bN‿bA‿bW‿bP←≍¨˜⟜(+`»)cgl M←1⊸⊑(0⊸≤∧>)-⟜⊑ vi←⊑bD charRole←((⊑bI)↑/0∾3↑cgl)∾(5/⌽↕2)∾0 spc←⥊3‿5‿6-⌜3‿0 Tokenize←{ r←𝕩='#'⋄s←/0‿0⊸«⊸∧sm←𝕩='''⋄d←/dm←𝕩='"' g←⍋q←∾⟨ s⋄¯1↓d⋄/r⟩ ⋄q↩g⊏q e← g⊏∾⟨2+s⋄ 1↓d⋄-⟜»∘⊏⟜(0∾+`r)⊸//(𝕩=lf)∾1⟩ Se←{(⊏˜𝕨)Se 1¨⌾((𝕩/𝕨)⊸⊏)𝕩}⍟{0=¯1⊑𝕩} st←¯1↓Se⟜(1↑˜≠)∾⟜≠q⍋e⋄q/˜↩st⋄e/˜↩st n←≠𝕩⋄a←n↑/⁼q⋄b←n↑/⁼e f←¬(≠`a∨b)∨«qe←a∧»⊸∧dm "Unclosed quote"!¬∨´(sm∨dm)∧bqe)×≠`dm∧a∨b c←CharCode f/𝕩 w←»⊸in←l∧(+`w)⊏0∾tw<0 num←ReadNums in∨⟜«⊸/○(0⊸∾)c×l ti←(us/˜«⊸us)×+`w>in)⊔c ki←((⍋⊏⟜in)⊸⊏/w)∾(ci∾/si)⊏+`»f k←id‿num‿chr‿str⋄k(⊢>¯1»⌈`)⊸/¨˜↩j←⊐¨k c↩(w∨¬l∨c M bW)/(∾j++`vi»≠¨k)⌾(ki⊸⊏)c c/˜↩¬(1»(c∊2‿4+⊑bB)∨⊢)⊸∧c M bS⋄c/˜↩¬(1«c∊3‿5+⊑bB)∧c M bS t←ti⌾((c M vi∾≠⊑k)⊸/)(vi⌊c)⊏charRole c+↩5×c M 5≍˜⊑bI ⟨c,t,≠⊑k,∾1↓k⟩ } ErrNumericChars←{ ⟨"Letter","s"/˜1<≠𝕩," """,𝕩⊏charSet,""" not allowed in numbers"⟩∾⊸!0 } ReadNums←{ e‿p‿i‿n‿d←=⟜𝕩¨((⊑bA)+-´"ea")∾+⟜↕´bN # eπ∞¯. ErrNumericChars∘(/⟜𝕩)⍟(∨´) ¬e∨𝕩<⊑bA m←¬n∨s←d∨c←e∨z←0=𝕩 "Negative sign in the middle of a number" ! ∧´n≤»c "Portion of a number is empty" ! ¬∨´(»¬m)∧s "Ill-formed decimal or exponent use" ! ∧´(0⊸=∨»⊸<)s/𝕩 "π and ∞ must occur alone" ! ∧´(p∨i)≤1(»∧(p∧«e)∨«)z∨n l←(¯1∾π‿1∾˜↕10)⊏˜(¬d)/m×𝕩-1-˜⊑bD v←(>⟜«0≤l)/(0⊸≤××⟜10⊸+)`»«l v×↩1‿¯1⊏˜(r←>⟜»d∨m)/»n vm←c/z ld←(⌈`⊢×1+↕∘≠)d∾0 dp←vm/(»⊸<×-)⟜(⊏⟜ld)(≠«/)c t←10⋆|ee←dp-˜vm/«v׬vm t÷˜⌾((0>ee)⊸/)t×⌾((0○≠◶⟨"opening"_mis_ 0, "closing"_mis_ 1˜⟩ 0 !˜ 𝕨 (Lcs<⌊○≠)◶⟨Msg,"Malformed bracket nesting"⟩ 𝕩 } ErrUndeclared←{ 0 !˜ "Undefined identifier"∾(1<≠𝕩)/"s" } Parse ← {nv‿r←𝕨 g←⍋pd←+`p←𝕩(Mׯ1⋆2|-⟜⊑)bB⋄br←p×𝕩M 2≍˜2+⊑bB p(=⟜1⊸/ErrMismatchedBrackets⍟≢1-˜=⟜¯1⊸/)○(g⊸⊏)𝕩 "Swapped open and closed brackets" ! 0≤(⊑g)⊑pd sl←«⊸∨𝕩 M bL⋄sr←»⌾(g⊸⊏)sl⋄sa←sl∨sr g⊏˜↩⍋g⊏sl⋄r×↩¬sa⋄o←p>0 pt←sa<𝕩=1+⊑bB rev←⍋+`1+¯1↓g((¯1∾⊣)(⊣⍋⊸⊏⊏˜-⊏˜⟜⍋)⟜⍋1(+`∘∾-∾˜)⊏)o∨sl∨𝕩 M bS gf←⍋fd←+`rev⊏br rev⊏˜↩gf⋄fd⊏˜↩gf 𝕩⊏˜↩rev⋄bv←rev⊏br⋄b←/bv<0⋄fi←+`c←bv>0 H←¬·1⊸«⊸/c(∨/⊣)= ft←(0∾1⊸H+2×2⊸H⌈2×3⊸H)(0‿3‿4‿5+5+⊑bI)⍋𝕩 fsc←ft⊏spc r↩((1↓ft)⊏(1+2⊸≤)⊸/↕4)⌾((b⊏rev)⊸⊏)r r+↩pt(⊣∧¬⊸∨=○(⌈`(1+↕∘≠)⊸×)⊢)(»⌾(g⊸⊏)3=r)∨1≤r id←/idm←(0⊸≤∧<⟜nv)xv←𝕩-vi⋄idx←id⊏𝕩⋄sp←/𝕩 M bI ad←(⌈`↕∘≠⊸×𝕩 M bG)⊏𝕩=⊑bG g↩⍋+`rev⊏p-br⋄gr←g⊏rev⋄sll←1+2÷˜0(<-○/>)gr⊏sr-sl⋄l←/g⊏𝕩=5+⊑bB g⊏˜↩gs←⍋gr⊏sl⋄gr↩g⊏rev⋄𝕩⊏˜↩g⋄r⊏˜↩gr⋄o⊏˜↩gr⋄si←/gr⊏sr>sl gi←⍋g⋄l⊏↩⍋gs s←𝕩 M bS⋄ps←s∨o∨gr⊏sl⋄a←𝕩 M 2≍˜⊑bG r-↩ps∨a⋄op←r≥2⋄fe←(r≥1)∨«r=3 tr←(⌈`↕∘≠⊸×»ps)⊏fe ma←tr<(𝕩=1+⊑bG)∧«fe ro←op∨a<«r=3⋄os←⌽↕∘≠⊸(⊣-⌈`∘×)⌽¬ro∨ma⋄at←(⊢+1+⊏⟜os)/a aa←g⊏asn←»+`gi⊏-⟜»(≠𝕩)↑/⁼at-1⋄r↩¯1¨⌾(aa⊸/)r tf←(a≤○(⌈`(1+↕∘≠)⊸×)ps)∧(⊢∧2(|<≤)ps(⊢-⌈`∘×)+`)¬ro opa←op>«ps∨a oa←⌽/opa⋄fa←/(«aa)<(tf∨¬tr)∧(ro∧«opa)<(r=1)∨op<»opa dy←fa⊏«(𝕩≠⊑bO)∧(tr∧r≥0)∨roo+`⊸⊏0∾lo⋄rt←/𝕩=2+⊑bB d←id⊏dec←idm∧ad∧asn⋄lc←-⟜»(c∾1)/+`dec∾0 ixf←(⊏⟜(¯1∾c/gf)∾d⊸/⊏((≠𝕩)∾b⊏gf)˜)id⊏fi ig←(⍋⊏⟜(ixx←∾⟜(d⊸/)idx))⊸⊏⍋ixf "Multiple definitions" ! 1∧´ixx∨○(»⊸≠((≠id)⊸≤⊸/ig)⊏⊢)ixf ig↩<⟜(≠id)⊸/(⍋+`∘⊏⟜(d∾-/˜d))⊸⊏ig d⊏˜↩ig⋄ErrUndeclared∘/˜⍟(0∨´⊢)⟜(d<»⊸≠)ig⊏idx ui←(⌈`↕∘≠⊸×d)⊸⊏⌾(ig⊸⊏)id ii←(ui⊏(fi⊏fsc)-(⌈`c⊸×)⊸¬+`dec)∾((sp⊏fi)⊏3×2|ft)++⟜(0⊸≤)2+sp⊏xv idor←∾3⥊