From 093620ac012d011518073620577d5807f7582267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20Ker=C3=A4nen?= Date: Fri, 17 Jun 2022 15:41:48 +0300 Subject: implement Unicode version of Explain --- src/eu.bqn | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/eu.bqn (limited to 'src') diff --git a/src/eu.bqn b/src/eu.bqn new file mode 100644 index 00000000..0961c269 --- /dev/null +++ b/src/eu.bqn @@ -0,0 +1,79 @@ +# Expression explainer: generates a Unicode box-drawing character diagram to +# show how a BQN program is evaluated + +wh ← 1‿1 + +Explain ← { + b‿const‿blk‿bdy‿(i‿e)‿tok ← 𝕨 + ba‿bc‿bo‿bp ← (⊏/¨1⊸↓)'0'-˜⟨ # For each instruction, number of: + "114113141111111315114131131111=111" # Codes until next opcode + "1110001100000000002221100000000111" # Arguments + "000111//23232303230000011022232111" # Stack values consumed + "1110001111111101111111101101111111" # Stack values output + "0000000011111101010000000000010000" # Position determiner + ⟩ + m ← { # Mask of instruction starts + n ← (↕≠b)+1+ba(⊣⊏˜≠⊸>×⊢)b + Se←{(⊏˜𝕨)Se 1¨⌾((𝕩/𝕨)⊸⊏)𝕩}⍟(0=¯1⊑⊢) + (≠↑∾⟜≠Se 1∾0¨) n + } + mb‿mi ← 0‿¯1 ↓¨ m⊸/¨ b‿i + la←¯1=na←mb⊏bc + na(b⊏˜1+⊣)⌾(la⊸/)˜↩/m + no←1⌾(¯1⊸⊑)mb⊏bo + r←+`no-na + ! 1=¯1⊑r + d←(+`no⊸×)⊸×f←0)○(+`(≠𝕩)↑/⁼)1+e, ti, ti⊏(s+e)÷2⟩ + } 𝕩 + + j←¯1↓((1-˜+`k)⊏ii)⊏˜⊏˜⍟≠{s←𝕩⊏˜g←⍋𝕩⋄(g/˜(⊒s)=s⊏mb⊏bp)⌾((⍷s)⊸⊏)↕≠mb}p + je←j∾¯1 + q←(/k≤j≠p⊏je-la) (⊏≍⊣) p + + pd←⌊¨1+⌽∘∾○<˜˘˜˝ q ⊏ ⍉wh×je≍d + dim←wh×⟨≠𝕩,1+⌈´d⟩+1‿0 + + Path ← {𝕊 (sx‿sy)‿(ex‿ey): + R←{(𝕨⌊𝕩)+↕1+|𝕨-𝕩} + xs←sx R ex ⋄ ys←sy R ey + p←¯1×sx>ex + (xs∾⌜(¯1⊑ys))∾(p⊑xs)∾⌜ys + } + Draw←{𝕊g: g×+˝(2⋆↕4)×>{𝕏g}¨⟨«,«˘,»,»˘⟩} + T←{t‿x 𝕊 s: p←x-⌊(2÷˜≠t) ⋄ ∾(p↑s)‿t‿(s↓˜p+≠t) } + repr←" ╷╶┌╵│└├╴┐─┬┘┤┴┼" + repri←⥊[ + 0‿1‿2‿3‿4‿5‿6‿7‿8‿9‿10‿11‿12‿13‿14‿15 + 1‿1‿3‿3‿5‿5‿7‿7‿9‿9‿11‿11‿13‿13‿15‿15 + 2‿3‿2‿3‿6‿7‿6‿7‿10‿11‿10‿11‿14‿15‿14‿15 + 3‿3‿3‿3‿7‿7‿7‿7‿11‿11‿11‿11‿15‿15‿15‿15 + 4‿5‿6‿7‿4‿5‿6‿7‿12‿13‿14‿15‿12‿13‿14‿15 + 5‿5‿7‿7‿7‿5‿7‿7‿13‿13‿15‿15‿13‿13‿15‿15 + 6‿7‿6‿7‿6‿7‿6‿7‿14‿15‿14‿15‿14‿15‿14‿15 + 7‿7‿7‿7‿7‿7‿7‿7‿15‿15‿15‿15‿15‿15‿15‿15 + 8‿9‿10‿11‿12‿13‿14‿15‿8‿9‿10‿11‿12‿13‿14‿15 + 9‿9‿11‿11‿13‿13‿15‿15‿9‿9‿11‿11‿13‿13‿15‿15 + 10‿11‿10‿11‿14‿15‿14‿15‿10‿11‿10‿11‿14‿15‿14‿15 + 11‿11‿11‿11‿15‿15‿15‿15‿11‿11‿11‿11‿15‿15‿15‿15 + 12‿13‿14‿15‿12‿13‿14‿15‿12‿13‿14‿15‿12‿13‿14‿15 + 13‿13‿15‿15‿13‿13‿15‿15‿13‿13‿15‿15‿13‿13‿15‿15 + 14‿15‿14‿15‿14‿15‿14‿15‿14‿15‿14‿15‿14‿15‿14‿15 + 15‿15‿15‿15‿15‿15‿15‿15‿15‿15‿15‿15‿15‿15‿15‿15 + ] + tp←⌽⚇1 ⌈ii (1‿0+wh×≍)¨ (k/p)⊏d + paths←⌽⚇1 Path¨<˘pd + graphs←{1¨⌾(𝕩⊸⊑) 0⥊˜1+⌽dim}¨paths + out←1↓⊏⟜repr{⊑⟜repri¨(𝕨×≠repr)+𝕩}´Draw¨graphs + {y‿x𝕊ti: out (ti⊑toks)‿x⊸T⌾(y⊸⊏)↩}´˘⍉tp≍ti # place tokens + out =⟜'╷'◶⊢‿'│'¨⌾⊏↩ # fix first row to look better + <˘∾(∾" "‿src‿" ")‿out +} -- cgit v1.2.3 From 3e541fb767357ab01c85abddb01cb91c95ba01e6 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 16 Jun 2022 04:55:25 -0400 Subject: =?UTF-8?q?Prevent=20aliases=20from=20being=20used=20except=20at?= =?UTF-8?q?=20the=20top=20level=20of=20a=20=E2=9F=A8=E2=9F=A9=20list?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/c.bqn | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/c.bqn b/src/c.bqn index 316617e5..70dac605 100644 --- a/src/c.bqn +++ b/src/c.bqn @@ -274,6 +274,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn "Can't nest assignments (write aliases with ⇐)"_err_(ai⊏G) ((5≠ai⊏gac)∧ak=2)aa af>↩alm←ai⊏aa⋄al←alm/ai # aliases al + "Aliases can only appear in ⟨⟩ bracketed lists"_err_(al⊏G) ¬al⊏(fo∨𝕩=⊑bB)<○IT lo ai/˜↩af⋄at/˜↩af∾1¨hj # Lexical resolution (independent of parsing part 2 below) -- cgit v1.2.3 From b5eecc8e7d7aa2975dc48cd734530306770fc13a Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 16 Jun 2022 13:38:06 -0400 Subject: Allow zero-length destructuring [] --- src/c.bqn | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/c.bqn b/src/c.bqn index 70dac605..020421b8 100644 --- a/src/c.bqn +++ b/src/c.bqn @@ -142,7 +142,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn "Parentheses can't contain separators"_err_(gb/G) ((⊑bB)⊸=»⊸∧pred⊸=∨sep⊸=)gbx←gb/gx BE←=∨+⟜2⊸= # Bracket equals: match ⟨[ or ⟩] given ⟨ or ⟩ only "Predicates can't be placed inside lists"_err_((sep≠GBX)/gb/G) ((4+⊑bB)⊸BE»⊸∧pred⊸=)sep⊸≠⊸/gbx - {"Empty statement or expression"_err_(𝕩/0∾G) (4+⊑bB)≠𝕩/0∾gx}1⊸«⊸∧1∾gb + {"Empty statement or expression"_err_(𝕩/0∾G) (4+⊑bB)>𝕩/0∾gx}1⊸«⊸∧1∾gb dl←«⊸∨dc←r=4 # Dot left r-↩(𝕩=⊑bG)>ec←«dc<0≤r+p # Role ¯4 for exports: ⊑bG is ⇐ "Invalid assignment or stranding use"_err_(↕≠) ((¯4⊸<∧≤⟜¯2)r)>(ec∨𝕩=2+⊑bG)∧»dc<0≤r @@ -258,6 +258,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn aa←×gac←g⊏ac↩»+`(1⊸»⊸∨0=+`)⊸×gi⊏ac # Broadcast ac to the entire target api←/(𝕩=⊑bO)∧ap←aa∧2=no # Assignment placeholder "Can't use Nothing (·) in lists"_nerr (¬ap)×no×(gr⊏¬ns)∨»lo∨ls + "Square brackets can't be empty"_err_(G) aa<(𝕩=6+⊑bB)∧1«ps ac-↩3×ah←6=ac # Assignment is header; 6→3 nx⌈↩aa×1=no # Prevent assignment to 𝕨 if it's · nf←H ac Date: Fri, 17 Jun 2022 14:02:36 -0400 Subject: Stricter syntax checking for aliases --- src/c.bqn | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/c.bqn b/src/c.bqn index 020421b8..615b0709 100644 --- a/src/c.bqn +++ b/src/c.bqn @@ -231,10 +231,11 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn "Dot must be preceded by a subject"_err_(⍋∘rev) (r=4)>»r=0 r(×⟜¬-⊢)↩dl # Namespace and dot to ¯1 - # Prep for lexical resolution before reordering 𝕩 - xv←𝕩-vi + # Reorder for parsing + xv←𝕩-vi # Save for lexical resolution {i↩(𝕨⊏i)⌾(𝕩⊸⊏)i⋄e↩(𝕩⊏e)⌾(𝕨⊸⊏)e}´bp # Highlight all contents of a pair when error reporting - 𝕩⊏˜↩g⋄hg←g⊏hf⋄r⊏˜↩gr⋄ir⊏˜↩gr⋄l↩(l0←l⊏⍋gs)∾/gr⊏sr>sl + 𝕩⊏˜↩g⋄hg←g⊏hf⋄r⊏˜↩gr⋄ns⊏˜↩gr⋄ir⊏˜↩gr + l↩(l0←l⊏⍋gs)∾/gr⊏sr>sl # Indices of list literals lm←(0¨sll)∾˜(5+⊑bB)-˜l0⊏𝕩 # List merge, adding 2 for [] # Parsing part 1 @@ -257,7 +258,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn at∾↩hj⋄ac←«⊸-(ak∾6¨hj)⌾(at⊸⊏)0¨𝕩 # Header assignment is 6 temporarily aa←×gac←g⊏ac↩»+`(1⊸»⊸∨0=+`)⊸×gi⊏ac # Broadcast ac to the entire target api←/(𝕩=⊑bO)∧ap←aa∧2=no # Assignment placeholder - "Can't use Nothing (·) in lists"_nerr (¬ap)×no×(gr⊏¬ns)∨»lo∨ls + "Can't use Nothing (·) in lists"_nerr (¬ap)×no×ns≤»lo∨ls "Square brackets can't be empty"_err_(G) aa<(𝕩=6+⊑bB)∧1«ps ac-↩3×ah←6=ac # Assignment is header; 6→3 nx⌈↩aa×1=no # Prevent assignment to 𝕨 if it's · @@ -275,7 +276,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn "Can't nest assignments (write aliases with ⇐)"_err_(ai⊏G) ((5≠ai⊏gac)∧ak=2)aa af>↩alm←ai⊏aa⋄al←alm/ai # aliases al - "Aliases can only appear in ⟨⟩ bracketed lists"_err_(al⊏G) ¬al⊏(fo∨𝕩=⊑bB)<○IT lo + "Alias must have a name on the right and appear within ⟨⟩"_err_(al⊏G) ¬(al-1)⊏aid∧ns∧»ls∨𝕩=4+⊑bB ai/˜↩af⋄at/˜↩af∾1¨hj # Lexical resolution (independent of parsing part 2 below) -- cgit v1.2.3