#! ./spec/dzref nl‿tab←•UCS 10‿9 charSet←∾charGroups←⟨ chF←"+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔" # Function "˜˘¨⌜⁼´`" # Modifier "∘○⊸⟜⌾⊘◶⎉⚇⍟" # Composition ¯1⊏˘10‿2⥊"𝕨𝕎𝕩𝕏𝕗𝔽𝕘𝔾𝕤𝕊" # Input (𝕣 pending; ℝ not allowed) nl∾"⋄," # Separator "←↩→" # Gets "(){}⟨⟩" # Bracket "‿" # Ligature •d # +⟜(↕10)⌾•UCS'0' # Digit "¯.π∞" # Numeric "_"∾˜' '(+∾⊢)⌾•UCS•a # Alphabetic 1↑"𝕨" # Prefix for input (hack around UTF-16) " "∾tab # Whitespace # #'" eliminated during tokenization ⟩ bF‿bM‿bC‿bI‿bS‿bG‿bB‿bL‿bD‿bN‿bA‿bP‿bW←⊔/≠¨charGroups vi←+´≠¨8↑charGroups charRole←(vi+1)↑(/0∾≠¨3↑charGroups)∾10⥊↕2 Tokenize←{ r←𝕩='#'⋄s←/(≠↑2⊸↓)⊸∧𝕩=⊑"'"⋄d←/𝕩='"' g←⍋q←∾⟨ s⋄¯1↓d⋄/r⟩ ⋄q↩g⊏q e← g⊏∾⟨2+s⋄ 1↓d⋄(⊢-¯1↓0∾⊢)∘⊏⟜(0∾+`r)⊸//(𝕩=nl)∾1⟩ Se←{(⊏˜𝕨)Se 1¨⌾((𝕩/𝕨)⊸⊏)𝕩}⍟{0=⊑⌽𝕩} st←¯1↓Se⟜(1↑˜≠)∾⟜≠q⊸⍋¨e⋄b←st/q∾˘e ToI←¯1↓·/⁼(≠𝕩)∾˜⥊⋄f←¬≠`ToI b cb←(¬(st/q)⊏r)/b nl←≠lu←⍷lit←𝕩⊔˜1-˜(+`ToI⊑˘cb)×≠`ToI cb cl←f/ToI⊑∘⌽˘cb args←charSet⊸⊐¨𝕨⋄c←charSet⊐f/𝕩 w←(≠↑0∾⊢)⊸0⋄e←q<0 l←1+-⟜(b/g)⌾(e/⊢)e×g ps←b∨g⊏(𝕩∊bS) sl←-⟜(≠↑0∾⊢)(ps∾1)/+`l∾1 PL←{sl⌾(𝕩⊸/)0¨𝕩} ⍋+`(¯1↓⍋0∾1+g)⊏1+(1(∾+○PL∾˜)ps)-1(∾+∾˜)l } DParse ← {nv‿r𝕊𝕩: g←⍋+`p←bB(⊣(≠⊸>ׯ1⋆2|⊢)⊐)𝕩 r+↩(𝕩=1⊑bB)(⊣∧¬⊸∨=○(⌈`(1+↕∘≠)⊸×)⊢)(¯1⊸⌽⌾(g⊸⊏)3=r)∨1≤r rev←p‿g RevE𝕩⋄g↩⍋+`rev⊏p gr←g⊏rev⋄𝕩⊏˜↩gr⋄r⊏˜↩gr⋄p⊏˜↩gr s←𝕩∊bS⋄o←p>0⋄ps←s∨o⋄a←𝕩∊2↑bG⋄r-↩ps∨a v←𝕩≥vi⋄op←r≥2⋄ro←1⌽r=3 tr←(⌈`↕∘≠⊸ׯ1⌽ps)⊏r≥1 tf←(a≤○(⌈`(1+↕∘≠)⊸×)ps)∧tr∧2(|<≤)ps(⊢-⌈`∘×)+`¬ro∨op opa←op>1↓0∾˜ps∨a⋄os←⌽↕∘≠⊸(⊣-⌈`∘×)⌽¬ro∨¯1⊸⌽⊸∨op oa←⌽/opa⋄fa←/(ro∧1⌽opa)<((tr∨op)<(r=1)∨¯1⌽opa)∨tf dy←fa⊏1↓0∾˜((r≥0)∧tr>tf)∨r=0 n←𝕩≥vi+nv⋄id←/v-n⋄cn←/n∨𝕩≤¯1⊑bC⋄u←⍷ob←cn⊏𝕩 lo←(o/𝕩)=4⊑bB⋄l←/𝕩=5⊑bB⋄ll←1+lo/1(↓--⊸↓)(o∾1)/+`s∾0 dr←/s>(+`o)⊏0∾lo or←⍋g⊏˜∾⟨cn,cn,id,id,1+/a,dr,l,l,oa+1⌈1-˜oa⊏os,fa+dy⟩ bc←or⊏∾⟨0¨cn,u⊐ob,1+(id-1)⊏a,vi-˜id⊏𝕩,(11-⊑bG)+a/𝕩 14¨dr,3¨l,ll,5+oa⊏r,5+dy+4×fa⊏tr⟩ bc‿u } prims←⟨ +,-,×,÷,⋆,√,⌊,⌈,|,¬,∧,∨,<,>,≠,=,≤,≥,≡,≢,⊣,⊢,⥊,∾,≍,↑,↓,↕,⌽,⍉,/,⍋,⍒,⊏,⊑,⊐,⊒,∊,⍷,⊔ ˜,˘,¨,⌜,⁼,´,` ∘,○,⊸,⟜,⌾,⊘,◶,⎉,⚇,⍟ ⟩ DGenFn←{ ⟨t,r,nVar,nLoc,lits⟩←⟨⟩Tokenize𝕩 ⟨bc,u⟩←nVar‿r DParse t o←(u-(vi+nVar-≠prims)×u≥vi)⊏prims∾ReadNum¨lits ⟨bc,o,nVar↑•a,⟨⟩⟩ } DRun←{ 'a' •COMP DGenFn 𝕩 }