From ff5c390e759c76728e14b104eb60a218384589cb Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 12 Jul 2021 17:30:38 -0400 Subject: =?UTF-8?q?Support=20two=20lists=20of=20function=20start=20indices?= =?UTF-8?q?;=20use=20for=20deferred=20blocks=20that=20require=20?= =?UTF-8?q?=F0=9D=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/c.bqn | 5 ++--- src/cjs.bqn | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/c.bqn b/src/c.bqn index dcbc5c27..e95e79d1 100644 --- a/src/c.bqn +++ b/src/c.bqn @@ -248,8 +248,6 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn fl←(dy×⊏⟜os)⊸+fa+dy # Function application site dr∾↩((1+dy)×fn←2=fm←fa⊏ne)/fl # Turn function applications on · to drops fn↩¬fn⋄fa/˜↩fn⋄fl/˜↩fn # And remove them - idor∾˜↩5/1+g⊏˜fw/¯1∾rt - idbc∾˜↩(+´fw)⥊⟨21‿0‿2‿18‿14⟩ # Bytecode generation: numbers bc ordered by source location (after rev) oi or←⍋oi←idor∾g⊏˜∾⟨cn,cn,bk,bk,2/l,dr,af/at,al+1,al+1,oa+1⌈oa⊏os,fl,rt⟩ @@ -260,7 +258,8 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn MI←-⊸↓˜⟜≠∾g⊏˜⊢⋄oj←(rt-∘≠⊸⌽oi⌊1-˜≠i)Mi∾⟨1-˜af/at,oa,fa⟩ ind←⟨oj,oj Mi fa⊏IT»¬ro∨ma⟩(¯1∾˜or⊏(≠rt)⊸⌽)⊸⊏¨i‿e # Function metadata and overall output - ⟨bc∾¯1⊑rc,u,⟨ft,¬fx,/1∾or≥bc-○≠rt,fsc+≠¨dn,dn,dx⟩,ind⟩ + fs←fw↑∘⥊⍟⊣¨⌾(fx⊸/)/1∾or≥bc-○≠rt # Function start indices + ⟨bc∾¯1⊑rc,u,⟨ft,¬fx,fs,fsc+≠¨dn,dn,dx⟩,ind⟩ } Compile←{ diff --git a/src/cjs.bqn b/src/cjs.bqn index d422d873..906fa55d 100755 --- a/src/cjs.bqn +++ b/src/cjs.bqn @@ -1,7 +1,7 @@ #! /usr/bin/env bqn # Javascript/JSON formatting -L ← "["∾"]"∾˜1↓·∾","⊸∾¨ # Native list/array +L ← "["∾"]"∾˜(0<≠)◶⟨"",1↓·∾","⊸∾¨⟩ # Native list/array Ind ← {∾𝕨‿"["‿𝕩‿"]"} # Native list/array indexing Cat ← {∾𝕨‿".concat("‿𝕩‿")"} # Native list/array concatenation (like ∾) # Escape the special characters that appear in BQN sources. @@ -24,7 +24,7 @@ useInd ← "-i"≡⊑args←•args ⋄ args↓˜↩useInd Comp ← ((<"runtime" Ind F)¨↕62) glyphs _getComp ⊢ J ← ∾∾⟜(@+10)¨ Fconst ← ≡◶⟨@⊸≤◶Num‿Char, Str, ⊑⟩ -Fout ← (≠↑⟨F,Fconst,L ·F¨4⊸↑,F⟩˙) {L𝕎¨𝕩}¨ ⊢ +Fout ← (≠↑⟨F,Fconst,L ·=◶⟨F,L(L F¨)¨⟩¨4⊸↑,F⟩˙) {L𝕎¨𝕩}¨ ⊢ Long ← ∾ (≠↑1‿3/⟨" "⊸∾⋄((@+10)∾" ,")⊸∾⟩˙) {𝕎𝕩}¨ ⊢ LFC ← Long∘Fout∘Comp -- cgit v1.2.3 From 4c7368f6cad8443aed82cd9c54a377e824cbed69 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Tue, 13 Jul 2021 15:15:09 -0400 Subject: Rudimentary/buggy support for two headerless bodies --- src/c.bqn | 46 +++++++++++++++++++++++++++------------------- src/cjs.bqn | 4 ++-- 2 files changed, 29 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/c.bqn b/src/c.bqn index e95e79d1..7f5dcb44 100644 --- a/src/c.bqn +++ b/src/c.bqn @@ -5,6 +5,7 @@ charSet‿cgl←(∾ ≍○< ≠¨)⟨ mod1 # 1-modifier mod2 # 2-modifier "⋄,"∾lf # Separator + ";" # Case separator "⇐←↩" # Gets "(){}⟨⟩" # Bracket "‿" # Ligature @@ -17,7 +18,7 @@ charSet‿cgl←(∾ ≍○< ≠¨)⟨ "•"∾(¯1↓"𝕨")∾" "∾@+9 # Whitespace (or special name prefix in UTF-16) "#'""@" # Preprocessed characters ⟩ -bF‿b1‿b2‿bS‿bG‿bB‿bL‿bO‿bX‿bN‿bD‿bA‿bW‿bP←≍¨˜⟜(0»+`)cgl +bF‿b1‿b2‿bS‿bC‿bG‿bB‿bL‿bO‿bX‿bN‿bD‿bA‿bW‿bP←≍¨˜⟜(0»+`)cgl M←1⊸⊑(0⊸≤∧>)-⟜⊑ # ∊ for an init,length pair 𝕩 as above sep←⊑bS bI←bX+≍⟜-5⋄bR←8+⊑bX @@ -31,7 +32,7 @@ CharCode←charSet{ } vd←1+vi←⊑bN # Start of identifier numbering (plus dot) -charRole←4∾˜∾⥊¨˜⟜(≠↑cgl˙)⟨1,2,3,¯1,¯3,¯1‿0,¯2,0,¬/5‿6⟩ # For first vd chars +charRole←4∾˜∾⥊¨˜⟜(≠↑cgl˙)⟨1,2,3,¯1,¯1,¯3,¯1‿0,¯2,0,¬/5‿6⟩ # For first vd chars T←⌈`× ⋄ IT←↕∘≠⊸T ⋄ I1T←(1+↕∘≠)⊸T # Source to ⟨tokens, roles, number of identifiers, literals⟩ @@ -147,18 +148,22 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn gf←⍋fd←+`br←rev⊏p×𝕩M⟨2+⊑bB,2⟩ # Order by brace depth fd to de-nest blocks rev⊏˜↩gf⋄fd⊏˜↩gf⋄br⊏˜↩gf 𝕩⊏˜↩rev⋄p⊏˜↩rev⋄i⊏˜↩rev⋄e⊏˜↩rev - fi←+`b←br>0⋄c←/br<0 # Block Begin (mask) and Close (index), in matching order # Block properties - PN←1(∾/∾˜)(∨/⊣)⋄H←b¬∘PN= # Which blocks have a property + fi←+`b←br>0⋄c←/br<0 # Block Begin (mask) and Close (index), in matching order + cb←b∨cs←𝕩=⊑bC⋄cf←1∾¬co←cb/cs⋄cm←0∾∨⟜«co + cc←(⍋⍋«co)⊏c∾/cs + "At most two header-less bodies allowed"_err_(/CB) »⊸∧co + PN←1(∾/∾˜)(∨/⊣)⋄H←cb¬∘PN⊢⋄HE←H∘= # Which bodies have a property sn←(0‿3‿5‿6+⊑bI)⍋𝕩⋄sp←/𝕩 M bI # Special name index - fx←1 H sn⋄fr←(fx∨0⊸<)⊸+ft←(2⊸H⌈2×3⊸H)sn # Block immediacy ¬fx and type ft + fx←H 1=sn⋄fr←(fx∨0⊸<)⊸+ft←(2⊸HE⌈2×3⊸HE)sn # Body immediacy ¬fx and type ft + "Block cases must be of the same kind"_err_(/CB) 1↓cf<»⊸≠fr "Special name outside of any block"_err_(/{(0=fi)∧𝕩 M bI}∘𝕩) 0<⊑fr fsc←(ft⊏0‿2‿3)+3×fx # Special name count # Propagate roles through parentheses # ir is the role of the expression ending at each position (truncated to the right) - r↩sl-˜ns×(1↓fr)⌾((c⊏rev)⊸⊏)r # Add block roles; make strand elements ¯1 + r↩sl-˜ns×(1↓cf/fr)⌾((c⊏rev)⊸⊏)r # Add block roles; make strand elements ¯1 pt←cp∧ns # Pass-through parentheses: not in strands pp←pt∧»es←1⊸»⌾(g⊸⊏)r<0 # Parens enclosing one object (maybe with assignment) don't change roles ir←((»⌾(g⊸⊏)(1+es)×3=⊢)⌈⊢-es<2≤⊢)r+pp×(IT¬pp)⊏r # Propagate modifier roles @@ -187,6 +192,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn oa←⌽/op←(er<2)∧r≥2⋄ro←op∨«op∧m2←r=3 # op: active modifiers; ro: mod or right operand "Missing operand"_nerr op×2(«⌈m2×»)no⌈2×m2≥ro∨r∊↕2 s←𝕩=sep⋄fo←𝕩=2+⊑bB⋄ls←s∧fo<○IT lo←𝕩=4+⊑bB # List Separators: after ⟨lo, not {fo + fc←𝕩=⊑bC "Can't use Nothing (·) in lists"_nerr ne×»lo∨ls "Double subjects (missing ‿?)"_err_(G) ∧⟜«ro»⊸∨⊸)ia∾sa # Opcode - idbc←⟨26¨di,di⊏xv, ido,idd∾0¨sp,idi∾spi⟩ # Identifier bytecode: instruction, depth, slot + idoc←⟨26¨di,di⊏xv, ido,idd∾0¨sp,idi∾spi⟩ # Identifier bytecode: instruction, depth, slot # Parsing part 2 ta←tr∧2(>∨|)ps(⊢-T)+`¬ro # Train argument (first-level) @@ -241,31 +248,32 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn "Second-level parts of a train must be functions"_err_(G) tr>fe∨ff dy←2≠ny←fa⊏2«no⌈2׬(tr∧r≥0)∨ro(2=ne)∨ls∨»r=¯5⋄rt←/fo # Drop (block separator) and return + dr←/s>(2=ne)∨ls∨»r=¯5⋄rt←/fo∨fc # Drop (block separator) and return fl←(dy×⊏⟜os)⊸+fa+dy # Function application site dr∾↩((1+dy)×fn←2=fm←fa⊏ne)/fl # Turn function applications on · to drops fn↩¬fn⋄fa/˜↩fn⋄fl/˜↩fn # And remove them - # Bytecode generation: numbers bc ordered by source location (after rev) oi + # Object code generation: numbers oc ordered by source location (after rev) oi or←⍋oi←idor∾g⊏˜∾⟨cn,cn,bk,bk,2/l,dr,af/at,al+1,al+1,oa+1⌈oa⊏os,fl,rt⟩ - bc←or⊏∾idbc∾⟨0¨cn,ob,15¨bk,1+↕≠bk,⥊⍉(3+l⊏aa)≍ll,14¨dr + oc←or⊏∾idoc∾⟨0¨cn,ob,15¨bk,1+↕≠bk,⥊⍉(3+l⊏aa)≍ll,14¨dr 11⌈(11-1+⊑bG)+(af/ai)⊏ma+𝕩,28¨al,vi-˜(al-1)⊏𝕩 5+oa⊏r,19⌊5+(fn/dy+11×fm⌈1=ny)+4×0blk, oi, tx⟩ + ⟨oc,prim,blk,bdy,oi⟩←⟨role,⊑val,t0,t1,redef»0¨vars⟩ Parse tok + ⟨oc, ∾⟨prim⊏prims⟩∾1↓val, <˘⍉>blk, <˘⍉>bdy, oi, tx⟩ } diff --git a/src/cjs.bqn b/src/cjs.bqn index 906fa55d..40ef9841 100755 --- a/src/cjs.bqn +++ b/src/cjs.bqn @@ -19,12 +19,12 @@ FP ← ∞⊸=◶⟨F,"Infinity"⟩ # Format positive number Num ← 0⊸≤◶⟨"-"∾FP∘|,FP⟩ # Format number glyphs ← •Import "glyphs.bqn" -_getComp ← { (3+useInd) ↑ (𝕗 •Import "c.bqn"){𝔽} } +_getComp ← { (4+useInd) ↑ (𝕗 •Import "c.bqn"){𝔽} } useInd ← "-i"≡⊑args←•args ⋄ args↓˜↩useInd Comp ← ((<"runtime" Ind F)¨↕62) glyphs _getComp ⊢ J ← ∾∾⟜(@+10)¨ Fconst ← ≡◶⟨@⊸≤◶Num‿Char, Str, ⊑⟩ -Fout ← (≠↑⟨F,Fconst,L ·=◶⟨F,L(L F¨)¨⟩¨4⊸↑,F⟩˙) {L𝕎¨𝕩}¨ ⊢ +Fout ← (≠↑⟨F,Fconst,L =◶⟨F,L(L F¨)¨⟩¨,L ·F¨2⊸↑,F⟩˙) {L𝕎¨𝕩}¨ ⊢ Long ← ∾ (≠↑1‿3/⟨" "⊸∾⋄((@+10)∾" ,")⊸∾⟩˙) {𝕎𝕩}¨ ⊢ LFC ← Long∘Fout∘Comp -- cgit v1.2.3 From cc923d8f03f3859433f9580959e55ef6fa0b2ec0 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Tue, 13 Jul 2021 15:35:12 -0400 Subject: Scope multiple bodies separately --- src/c.bqn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/c.bqn b/src/c.bqn index 7f5dcb44..de8b77b7 100644 --- a/src/c.bqn +++ b/src/c.bqn @@ -150,8 +150,8 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn 𝕩⊏˜↩rev⋄p⊏˜↩rev⋄i⊏˜↩rev⋄e⊏˜↩rev # Block properties - fi←+`b←br>0⋄c←/br<0 # Block Begin (mask) and Close (index), in matching order - cb←b∨cs←𝕩=⊑bC⋄cf←1∾¬co←cb/cs⋄cm←0∾∨⟜«co + b←br>0⋄c←/br<0 # Block Begin (mask) and Close (index), in matching order + fi←+`cb←b∨cs←𝕩=⊑bC⋄cf←1∾¬co←cb/cs⋄cm←0∾∨⟜«co cc←(⍋⍋«co)⊏c∾/cs "At most two header-less bodies allowed"_err_(/CB) »⊸∧co PN←1(∾/∾˜)(∨/⊣)⋄H←cb¬∘PN⊢⋄HE←H∘= # Which bodies have a property @@ -223,7 +223,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn d↩(0≤dpf)⌾(dp⊸/)d⋄zda←0¨da←/def≤0 # Turn def ¯1 ← into ↩ dn←(dg←zda∾(df←d/idf)∾≠fsc)⊔da∾dv←d/idv # Identifier name ID, per-block # Order every referenced identifier, and an undeclaration for each declaration - ixf←((1=ic)+idf⊏¯1∾b/gf)∾df⊏(≠𝕩)∾c⊏gf # First order by block index, open for real and closed for virtual + ixf←((1=ic)+idf⊏¯1∾cb/gf)∾df⊏(≠𝕩)∾cc⊏gf # First order by block index, open for real and closed for virtual ig←(⍋⊏⟜(ixx←idv∾dv))⊸⊏⍋ixf # Then order by name {"Redefinition"_err_(𝕩⊏·∾⟜(d⊸/)ID) ¬ixx∨○(»⊸≠𝕩⊸⊏)ixf} (≠d)⊸≤⊸/ig ig↩<⟜(≠d)⊸/(⍋ds←+`ig⊏d∾¯1¨dv)⊏ig # Last order by declaration depth -- cgit v1.2.3 From 24dd446173ec6d004a1bdf2fb78cb7635ea8dbf7 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Tue, 13 Jul 2021 16:57:05 -0400 Subject: Another scope resolution issue --- src/c.bqn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/c.bqn b/src/c.bqn index de8b77b7..5d10238a 100644 --- a/src/c.bqn +++ b/src/c.bqn @@ -223,7 +223,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn d↩(0≤dpf)⌾(dp⊸/)d⋄zda←0¨da←/def≤0 # Turn def ¯1 ← into ↩ dn←(dg←zda∾(df←d/idf)∾≠fsc)⊔da∾dv←d/idv # Identifier name ID, per-block # Order every referenced identifier, and an undeclaration for each declaration - ixf←((1=ic)+idf⊏¯1∾cb/gf)∾df⊏(≠𝕩)∾cc⊏gf # First order by block index, open for real and closed for virtual + ixf←((1=ic)+idf⊏¯1∾cb/gf)∾df⊏(≠𝕩)∾1-˜cc⊏gf# First order by block index, open for real and closed for virtual ig←(⍋⊏⟜(ixx←idv∾dv))⊸⊏⍋ixf # Then order by name {"Redefinition"_err_(𝕩⊏·∾⟜(d⊸/)ID) ¬ixx∨○(»⊸≠𝕩⊸⊏)ixf} (≠d)⊸≤⊸/ig ig↩<⟜(≠d)⊸/(⍋ds←+`ig⊏d∾¯1¨dv)⊏ig # Last order by declaration depth -- cgit v1.2.3 From 198e11ebbeb4d7601bd3d8161d85c848c47ebfed Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Fri, 16 Jul 2021 14:26:54 -0400 Subject: Don't allow multiple bodies in immediate blocks --- 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 5d10238a..3bb84371 100644 --- a/src/c.bqn +++ b/src/c.bqn @@ -157,7 +157,8 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn PN←1(∾/∾˜)(∨/⊣)⋄H←cb¬∘PN⊢⋄HE←H∘= # Which bodies have a property sn←(0‿3‿5‿6+⊑bI)⍋𝕩⋄sp←/𝕩 M bI # Special name index fx←H 1=sn⋄fr←(fx∨0⊸<)⊸+ft←(2⊸HE⌈2×3⊸HE)sn # Body immediacy ¬fx and type ft - "Block cases must be of the same kind"_err_(/CB) 1↓cf<»⊸≠fr + "Only blocks with explicit arguments can have multiple bodies"_err_(/CB) 1↓cm>fx + "Block bodies must be of the same kind"_err_(/CB) 1↓cf<»⊸≠ft "Special name outside of any block"_err_(/{(0=fi)∧𝕩 M bI}∘𝕩) 0<⊑fr fsc←(ft⊏0‿2‿3)+3×fx # Special name count -- cgit v1.2.3