basedpl 0.1.80__tar.gz → 0.1.82__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. {basedpl-0.1.80 → basedpl-0.1.82}/Cargo.lock +5 -5
  2. {basedpl-0.1.80 → basedpl-0.1.82}/Cargo.toml +1 -1
  3. {basedpl-0.1.80 → basedpl-0.1.82}/DEV.md +4 -4
  4. {basedpl-0.1.80 → basedpl-0.1.82}/PKG-INFO +2 -2
  5. {basedpl-0.1.80 → basedpl-0.1.82}/editors/windows/README.md +1 -1
  6. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/.gitignore +1 -0
  7. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/fonts/README.md +1 -1
  8. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/fonts.css +1 -1
  9. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery.qmd +1 -0
  10. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/magics.ipynb +14 -32
  11. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/playground/bpl.js +5 -7
  12. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/playground.qmd +1 -0
  13. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/repl.qmd +1 -1
  14. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/web.ipynb +11 -9
  15. {basedpl-0.1.80 → basedpl-0.1.82}/package.json +1 -0
  16. {basedpl-0.1.80 → basedpl-0.1.82}/pyproject.toml +3 -2
  17. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/__init__.py +3 -2
  18. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/_modidx.py +0 -2
  19. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/bpltests.py +5 -6
  20. basedpl-0.1.82/python/basedpl/browser/bpl-editor.js +32 -0
  21. {basedpl-0.1.80/python/basedpl → basedpl-0.1.82/python/basedpl/browser}/input.js +2 -2
  22. basedpl-0.1.82/python/basedpl/browser/language.js +3 -0
  23. {basedpl-0.1.80/python/basedpl → basedpl-0.1.82/python/basedpl/browser}/lb.js +42 -41
  24. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/editors.py +4 -21
  25. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/font.py +2 -2
  26. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/fonts.css +1 -1
  27. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/keyboards.py +2 -2
  28. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/notebooks.py +4 -17
  29. {basedpl-0.1.80 → basedpl-0.1.82}/src/symbols.rs +2 -2
  30. {basedpl-0.1.80 → basedpl-0.1.82}/tests/highlighting.mjs +1 -1
  31. {basedpl-0.1.80 → basedpl-0.1.82}/tests/input.mjs +3 -2
  32. {basedpl-0.1.80 → basedpl-0.1.82}/tests/speed.rs +4 -1
  33. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_api.py +4 -0
  34. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_kernel.py +1 -1
  35. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_repl.py +1 -1
  36. {basedpl-0.1.80 → basedpl-0.1.82}/.cargo/config.toml +0 -0
  37. {basedpl-0.1.80 → basedpl-0.1.82}/.gitattributes +0 -0
  38. {basedpl-0.1.80 → basedpl-0.1.82}/.github/workflows/ci.yml +0 -0
  39. {basedpl-0.1.80 → basedpl-0.1.82}/.github/workflows/docs.yml +0 -0
  40. {basedpl-0.1.80 → basedpl-0.1.82}/.github/workflows/speed.yml +0 -0
  41. {basedpl-0.1.80 → basedpl-0.1.82}/.github/workflows/test.yml +0 -0
  42. {basedpl-0.1.80 → basedpl-0.1.82}/.gitignore +0 -0
  43. {basedpl-0.1.80 → basedpl-0.1.82}/.node-version +0 -0
  44. {basedpl-0.1.80 → basedpl-0.1.82}/CONTRIBUTING.md +0 -0
  45. {basedpl-0.1.80 → basedpl-0.1.82}/LICENSE +0 -0
  46. {basedpl-0.1.80 → basedpl-0.1.82}/README.md +0 -0
  47. {basedpl-0.1.80 → basedpl-0.1.82}/_config.yml +0 -0
  48. {basedpl-0.1.80 → basedpl-0.1.82}/_layouts/default.html +0 -0
  49. {basedpl-0.1.80 → basedpl-0.1.82}/build.rs +0 -0
  50. {basedpl-0.1.80 → basedpl-0.1.82}/editors/jetbrains/BPL.tmbundle/Syntaxes/bpl.tmLanguage.json +0 -0
  51. {basedpl-0.1.80 → basedpl-0.1.82}/editors/jetbrains/BPL.tmbundle/Syntaxes/hpl.tmLanguage.json +0 -0
  52. {basedpl-0.1.80 → basedpl-0.1.82}/editors/jetbrains/BPL.tmbundle/info.plist +0 -0
  53. {basedpl-0.1.80 → basedpl-0.1.82}/editors/jetbrains/BPL.xml +0 -0
  54. {basedpl-0.1.80 → basedpl-0.1.82}/editors/jetbrains/README.md +0 -0
  55. {basedpl-0.1.80 → basedpl-0.1.82}/editors/macos/BasedPL-de.txt +0 -0
  56. {basedpl-0.1.80 → basedpl-0.1.82}/editors/macos/BasedPL-es.txt +0 -0
  57. {basedpl-0.1.80 → basedpl-0.1.82}/editors/macos/BasedPL-fr.txt +0 -0
  58. {basedpl-0.1.80 → basedpl-0.1.82}/editors/macos/BasedPL-uk.txt +0 -0
  59. {basedpl-0.1.80 → basedpl-0.1.82}/editors/macos/BasedPL-us.txt +0 -0
  60. {basedpl-0.1.80 → basedpl-0.1.82}/editors/vim/ftdetect/bpl.vim +0 -0
  61. {basedpl-0.1.80 → basedpl-0.1.82}/editors/vim/syntax/bpl.vim +0 -0
  62. {basedpl-0.1.80 → basedpl-0.1.82}/editors/windows/build.ps1 +0 -0
  63. {basedpl-0.1.80 → basedpl-0.1.82}/editors/windows/install.ps1 +0 -0
  64. {basedpl-0.1.80 → basedpl-0.1.82}/editors/windows/keyboard.c +0 -0
  65. {basedpl-0.1.80 → basedpl-0.1.82}/editors/windows/keyboard.def +0 -0
  66. {basedpl-0.1.80 → basedpl-0.1.82}/editors/windows/keyboard.rc +0 -0
  67. {basedpl-0.1.80 → basedpl-0.1.82}/editors/windows/layout.h +0 -0
  68. {basedpl-0.1.80 → basedpl-0.1.82}/index_files/figure-commonmark/cell-17-output-1.svg +0 -0
  69. {basedpl-0.1.80 → basedpl-0.1.82}/index_files/figure-commonmark/cell-18-output-1.svg +0 -0
  70. {basedpl-0.1.80 → basedpl-0.1.82}/index_files/figure-html/cell-17-output-1.svg +0 -0
  71. {basedpl-0.1.80 → basedpl-0.1.82}/index_files/figure-html/cell-18-output-1.svg +0 -0
  72. {basedpl-0.1.80 → basedpl-0.1.82}/lib/LICENSE-april +0 -0
  73. {basedpl-0.1.80 → basedpl-0.1.82}/lib/README.md +0 -0
  74. {basedpl-0.1.80 → basedpl-0.1.82}/lib/array.bpl +0 -0
  75. {basedpl-0.1.80 → basedpl-0.1.82}/lib/dyalog.bpl +0 -0
  76. {basedpl-0.1.80 → basedpl-0.1.82}/lib/graph.bpl +0 -0
  77. {basedpl-0.1.80 → basedpl-0.1.82}/lib/numeric.bpl +0 -0
  78. {basedpl-0.1.80 → basedpl-0.1.82}/lib/power.bpl +0 -0
  79. {basedpl-0.1.80 → basedpl-0.1.82}/lib/regex.bpl +0 -0
  80. {basedpl-0.1.80 → basedpl-0.1.82}/lib/string.bpl +0 -0
  81. {basedpl-0.1.80 → basedpl-0.1.82}/lib/tree.bpl +0 -0
  82. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/_quarto.yml +0 -0
  83. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/arrays.ipynb +0 -0
  84. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/assignment.ipynb +0 -0
  85. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/autodiff.qmd +0 -0
  86. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/bpl.xml +0 -0
  87. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/bqn.xml +0 -0
  88. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/bracket-types.ipynb +0 -0
  89. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/cli.qmd +0 -0
  90. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/comparison.qmd +0 -0
  91. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/composition.qmd +0 -0
  92. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/data.ipynb +0 -0
  93. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/dfns.ipynb +0 -0
  94. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/distributions.ipynb +0 -0
  95. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/driver.js +0 -0
  96. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/dyalog.ipynb +0 -0
  97. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/dyalog.xml +0 -0
  98. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/evaluation.qmd +0 -0
  99. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/fonts/BQN386B.woff2 +0 -0
  100. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery/attractor.bpl +0 -0
  101. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery/boids.bpl +0 -0
  102. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery/dragon.bpl +0 -0
  103. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery/flow.bpl +0 -0
  104. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery/mandelbrot.bpl +0 -0
  105. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery/mandelbrot32.bpl +0 -0
  106. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery/orbits.bpl +0 -0
  107. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery/phyllotaxis.bpl +0 -0
  108. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery/prefs.bpl +0 -0
  109. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/gallery/reaction.bpl +0 -0
  110. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/getting-started.ipynb +0 -0
  111. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/_metadata.yml +0 -0
  112. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/alpha-underbar.qmd +0 -0
  113. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/alpha.qmd +0 -0
  114. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/at.qmd +0 -0
  115. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/backslash-bar.qmd +0 -0
  116. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/backslash.qmd +0 -0
  117. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/braces.qmd +0 -0
  118. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/brackets.qmd +0 -0
  119. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/bullet.qmd +0 -0
  120. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/circle-backslash.qmd +0 -0
  121. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/circle-bar.qmd +0 -0
  122. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/circle-diaeresis.qmd +0 -0
  123. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/circle-divide.qmd +0 -0
  124. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/circle-slash.qmd +0 -0
  125. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/circle-star.qmd +0 -0
  126. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/circle-stile.qmd +0 -0
  127. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/circle-times.qmd +0 -0
  128. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/circle.qmd +0 -0
  129. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/colon.qmd +0 -0
  130. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/comma-bar.qmd +0 -0
  131. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/comma.qmd +0 -0
  132. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/del-diaeresis.qmd +0 -0
  133. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/del-stile.qmd +0 -0
  134. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/del.qmd +0 -0
  135. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/delta-stile.qmd +0 -0
  136. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/diaeresis.qmd +0 -0
  137. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/diamond-underbar.qmd +0 -0
  138. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/diamond.qmd +0 -0
  139. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/domino.qmd +0 -0
  140. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/dot.qmd +0 -0
  141. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/down-arrow.qmd +0 -0
  142. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/down-shoe.qmd +0 -0
  143. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/down-tack.qmd +0 -0
  144. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/downstile.qmd +0 -0
  145. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/epsilon-underbar.qmd +0 -0
  146. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/epsilon.qmd +0 -0
  147. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/equal-underbar-slash.qmd +0 -0
  148. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/equal-underbar.qmd +0 -0
  149. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/equals.qmd +0 -0
  150. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/error-guard.qmd +0 -0
  151. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/exclamation.qmd +0 -0
  152. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/greater-than-or-equal.qmd +0 -0
  153. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/greater-than.qmd +0 -0
  154. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/hash.qmd +0 -0
  155. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/hydrant.qmd +0 -0
  156. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/infinity.qmd +0 -0
  157. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/inverted-question.qmd +0 -0
  158. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/iota-underbar.qmd +0 -0
  159. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/iota.qmd +0 -0
  160. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/jot-diaeresis.qmd +0 -0
  161. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/jot.qmd +0 -0
  162. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/lamp.qmd +0 -0
  163. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/left-arrow.qmd +0 -0
  164. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/left-shoe-underbar.qmd +0 -0
  165. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/left-shoe.qmd +0 -0
  166. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/left-tack.qmd +0 -0
  167. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/left-tail-arrow.qmd +0 -0
  168. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/less-than-or-equal.qmd +0 -0
  169. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/less-than.qmd +0 -0
  170. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/minus.qmd +0 -0
  171. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/not-equals.qmd +0 -0
  172. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/obelus.qmd +0 -0
  173. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/omega-underbar.qmd +0 -0
  174. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/omega.qmd +0 -0
  175. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/overbar.qmd +0 -0
  176. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/parentheses.qmd +0 -0
  177. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/partial.qmd +0 -0
  178. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/pi.qmd +0 -0
  179. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/plus.qmd +0 -0
  180. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/quad-colon.qmd +0 -0
  181. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/quad-diamond.qmd +0 -0
  182. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/quad-equal.qmd +0 -0
  183. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/quad-jot.qmd +0 -0
  184. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/quad.qmd +0 -0
  185. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/question.qmd +0 -0
  186. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/quote.qmd +0 -0
  187. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/radical.qmd +0 -0
  188. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/rho.qmd +0 -0
  189. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/right-arrow-from-bar.qmd +0 -0
  190. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/right-left-arrows.qmd +0 -0
  191. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/right-shoe.qmd +0 -0
  192. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/right-tack.qmd +0 -0
  193. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/right-tail-arrow.qmd +0 -0
  194. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/slash-bar.qmd +0 -0
  195. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/slash.qmd +0 -0
  196. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/squad.qmd +0 -0
  197. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/star-diaeresis.qmd +0 -0
  198. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/star.qmd +0 -0
  199. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/stile-tilde.qmd +0 -0
  200. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/stile.qmd +0 -0
  201. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/superscript-b.qmd +0 -0
  202. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/thorn.qmd +0 -0
  203. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/tilde-diaeresis.qmd +0 -0
  204. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/tilde.qmd +0 -0
  205. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/times.qmd +0 -0
  206. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/tricolon.qmd +0 -0
  207. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/up-arrow.qmd +0 -0
  208. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/up-down-arrow.qmd +0 -0
  209. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/up-shoe.qmd +0 -0
  210. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/up-tack.qmd +0 -0
  211. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/upstile.qmd +0 -0
  212. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/vee-bar.qmd +0 -0
  213. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/vee.qmd +0 -0
  214. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/wedge-bar.qmd +0 -0
  215. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/wedge.qmd +0 -0
  216. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs/zilde.qmd +0 -0
  217. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs-study.qmd +0 -0
  218. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/glyphs.qmd +0 -0
  219. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/hanzi-notation-zh.ipynb +0 -0
  220. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/hanzi-notation.ipynb +0 -0
  221. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/hpl.xml +0 -0
  222. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/index-notation.qmd +0 -0
  223. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/index.ipynb +0 -0
  224. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/indexing.ipynb +0 -0
  225. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/introspection.ipynb +0 -0
  226. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/keyboard.qmd +0 -0
  227. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/keyed.ipynb +0 -0
  228. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/llms.txt +0 -0
  229. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/mathish.qmd +0 -0
  230. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/modules.qmd +0 -0
  231. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/nbdev.yml +0 -0
  232. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/notebooks.ipynb +0 -0
  233. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/numbers.qmd +0 -0
  234. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/overview.ipynb +0 -0
  235. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/papers/aplwiki-arrays.md +0 -0
  236. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/papers/brickman-depth-1-scalars.md +0 -0
  237. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/papers/mercer-based-system.md +0 -0
  238. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/performance.qmd +0 -0
  239. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/playground/gallery.js +0 -0
  240. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/playground/monaco-worker.js +0 -0
  241. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/playground/page.js +0 -0
  242. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/playground/worker.js +0 -0
  243. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/plot.ipynb +0 -0
  244. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/principles.ipynb +0 -0
  245. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/processes.qmd +0 -0
  246. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/puppy.jpg +0 -0
  247. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/python.ipynb +0 -0
  248. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/regex.ipynb +0 -0
  249. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/scripts.ipynb +0 -0
  250. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/sidebar.yml +0 -0
  251. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/strings.ipynb +0 -0
  252. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/study/01_basics.ipynb +0 -0
  253. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/study/02_functions.ipynb +0 -0
  254. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/study/03_operators.ipynb +0 -0
  255. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/study/04_nested-arrays.ipynb +0 -0
  256. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/study/05_searching-indexing.ipynb +0 -0
  257. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/study/06_rearranging-arrays.ipynb +0 -0
  258. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/study/07_numerical-tools.ipynb +0 -0
  259. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/style.qmd +0 -0
  260. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/styles.css +0 -0
  261. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/syntax.qmd +0 -0
  262. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/_metadata.yml +0 -0
  263. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/c.qmd +0 -0
  264. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/canvas.qmd +0 -0
  265. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/constants.qmd +0 -0
  266. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/copy.qmd +0 -0
  267. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/csv.qmd +0 -0
  268. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/date.qmd +0 -0
  269. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/decompose.qmd +0 -0
  270. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/deflate.qmd +0 -0
  271. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/delay.qmd +0 -0
  272. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/detach.qmd +0 -0
  273. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/distribution.qmd +0 -0
  274. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/edge.qmd +0 -0
  275. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/element.qmd +0 -0
  276. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/ex.qmd +0 -0
  277. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/explain.qmd +0 -0
  278. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/fetch.qmd +0 -0
  279. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/float.qmd +0 -0
  280. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/hash.qmd +0 -0
  281. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/host.qmd +0 -0
  282. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/image.qmd +0 -0
  283. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/index.qmd +0 -0
  284. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/js.qmd +0 -0
  285. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/json.qmd +0 -0
  286. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/literal.qmd +0 -0
  287. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/load.qmd +0 -0
  288. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/memory.qmd +0 -0
  289. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/metadata.qmd +0 -0
  290. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/mime.qmd +0 -0
  291. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/mkdir.qmd +0 -0
  292. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/nc.qmd +0 -0
  293. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/nget.qmd +0 -0
  294. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/nl.qmd +0 -0
  295. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/normalize.qmd +0 -0
  296. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/nput.qmd +0 -0
  297. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/path.qmd +0 -0
  298. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/plot.qmd +0 -0
  299. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/prefs.qmd +0 -0
  300. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/r.qmd +0 -0
  301. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/rand.qmd +0 -0
  302. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/readdir.qmd +0 -0
  303. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/remove.qmd +0 -0
  304. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/rename.qmd +0 -0
  305. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/signal.qmd +0 -0
  306. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/src.qmd +0 -0
  307. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/storage.qmd +0 -0
  308. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/svg.qmd +0 -0
  309. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/time.qmd +0 -0
  310. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/ucs.qmd +0 -0
  311. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/uuid.qmd +0 -0
  312. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/vfi.qmd +0 -0
  313. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system/xml.qmd +0 -0
  314. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/system-functions.qmd +0 -0
  315. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/terms.qmd +0 -0
  316. {basedpl-0.1.80 → basedpl-0.1.82}/nbs/xml.ipynb +0 -0
  317. {basedpl-0.1.80 → basedpl-0.1.82}/package-lock.json +0 -0
  318. {basedpl-0.1.80 → basedpl-0.1.82}/provenance/README.md +0 -0
  319. {basedpl-0.1.80 → basedpl-0.1.82}/provenance/aplcart.jsonl +0 -0
  320. {basedpl-0.1.80 → basedpl-0.1.82}/provenance/april.jsonl +0 -0
  321. {basedpl-0.1.80 → basedpl-0.1.82}/provenance/bqn.jsonl +0 -0
  322. {basedpl-0.1.80 → basedpl-0.1.82}/provenance/core.jsonl +0 -0
  323. {basedpl-0.1.80 → basedpl-0.1.82}/provenance/dyalog.jsonl +0 -0
  324. {basedpl-0.1.80 → basedpl-0.1.82}/provenance/ngn.jsonl +0 -0
  325. {basedpl-0.1.80 → basedpl-0.1.82}/py/Cargo.toml +0 -0
  326. {basedpl-0.1.80 → basedpl-0.1.82}/py/build.rs +0 -0
  327. {basedpl-0.1.80 → basedpl-0.1.82}/py/src/lib.rs +0 -0
  328. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/__init__.py +0 -0
  329. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/fonts/BQN386B.ttf +0 -0
  330. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/fonts/LICENSE-BQN386 +0 -0
  331. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/fonts/LICENSE-SAX2 +0 -0
  332. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/fonts/SAX2B.ttf +0 -0
  333. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-de.bundle/Contents/Info.plist +0 -0
  334. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.icns +0 -0
  335. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.keylayout +0 -0
  336. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-de.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  337. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-de.bundle/Contents/version.plist +0 -0
  338. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-es.bundle/Contents/Info.plist +0 -0
  339. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.icns +0 -0
  340. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.keylayout +0 -0
  341. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-es.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  342. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-es.bundle/Contents/version.plist +0 -0
  343. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-fr.bundle/Contents/Info.plist +0 -0
  344. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.icns +0 -0
  345. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.keylayout +0 -0
  346. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-fr.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  347. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-fr.bundle/Contents/version.plist +0 -0
  348. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-uk.bundle/Contents/Info.plist +0 -0
  349. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.icns +0 -0
  350. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.keylayout +0 -0
  351. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-uk.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  352. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-uk.bundle/Contents/version.plist +0 -0
  353. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-us.bundle/Contents/Info.plist +0 -0
  354. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.icns +0 -0
  355. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.keylayout +0 -0
  356. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-us.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  357. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/assets/macos/BasedPL-us.bundle/Contents/version.plist +0 -0
  358. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/bpl.tmLanguage.json +0 -0
  359. {basedpl-0.1.80/nbs/fonts → basedpl-0.1.82/python/basedpl/browser}/SAX2B.woff2 +0 -0
  360. {basedpl-0.1.80/python/basedpl → basedpl-0.1.82/python/basedpl/browser}/layout.json +0 -0
  361. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/dyalog.py +0 -0
  362. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/functions.py +0 -0
  363. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/hpl.tmLanguage.json +0 -0
  364. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/install.py +0 -0
  365. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/ipython.py +0 -0
  366. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/keyboards.json +0 -0
  367. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/notebook_runner.py +0 -0
  368. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/printing.py +0 -0
  369. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/reference.py +0 -0
  370. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/syntax.py +0 -0
  371. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/windows_keyboard.py +0 -0
  372. {basedpl-0.1.80 → basedpl-0.1.82}/python/basedpl/worker.py +0 -0
  373. {basedpl-0.1.80 → basedpl-0.1.82}/rustfmt.toml +0 -0
  374. {basedpl-0.1.80 → basedpl-0.1.82}/src/agreement.rs +0 -0
  375. {basedpl-0.1.80 → basedpl-0.1.82}/src/array/storage.rs +0 -0
  376. {basedpl-0.1.80 → basedpl-0.1.82}/src/array/text.rs +0 -0
  377. {basedpl-0.1.80 → basedpl-0.1.82}/src/array.rs +0 -0
  378. {basedpl-0.1.80 → basedpl-0.1.82}/src/batch.rs +0 -0
  379. {basedpl-0.1.80 → basedpl-0.1.82}/src/canvas.js +0 -0
  380. {basedpl-0.1.80 → basedpl-0.1.82}/src/canvas.rs +0 -0
  381. {basedpl-0.1.80 → basedpl-0.1.82}/src/csv.rs +0 -0
  382. {basedpl-0.1.80 → basedpl-0.1.82}/src/data.rs +0 -0
  383. {basedpl-0.1.80 → basedpl-0.1.82}/src/date.rs +0 -0
  384. {basedpl-0.1.80 → basedpl-0.1.82}/src/derivative.rs +0 -0
  385. {basedpl-0.1.80 → basedpl-0.1.82}/src/display.rs +0 -0
  386. {basedpl-0.1.80 → basedpl-0.1.82}/src/distribution.rs +0 -0
  387. {basedpl-0.1.80 → basedpl-0.1.82}/src/element.rs +0 -0
  388. {basedpl-0.1.80 → basedpl-0.1.82}/src/error.rs +0 -0
  389. {basedpl-0.1.80 → basedpl-0.1.82}/src/eval/assign.rs +0 -0
  390. {basedpl-0.1.80 → basedpl-0.1.82}/src/eval/binder.rs +0 -0
  391. {basedpl-0.1.80 → basedpl-0.1.82}/src/eval/bindings.rs +0 -0
  392. {basedpl-0.1.80 → basedpl-0.1.82}/src/eval/dissect.rs +0 -0
  393. {basedpl-0.1.80 → basedpl-0.1.82}/src/eval/idioms.rs +0 -0
  394. {basedpl-0.1.80 → basedpl-0.1.82}/src/eval/operators.rs +0 -0
  395. {basedpl-0.1.80 → basedpl-0.1.82}/src/eval/session.rs +0 -0
  396. {basedpl-0.1.80 → basedpl-0.1.82}/src/eval/tree.rs +0 -0
  397. {basedpl-0.1.80 → basedpl-0.1.82}/src/eval.rs +0 -0
  398. {basedpl-0.1.80 → basedpl-0.1.82}/src/execution.rs +0 -0
  399. {basedpl-0.1.80 → basedpl-0.1.82}/src/explain.rs +0 -0
  400. {basedpl-0.1.80 → basedpl-0.1.82}/src/files.rs +0 -0
  401. {basedpl-0.1.80 → basedpl-0.1.82}/src/fusion.rs +0 -0
  402. {basedpl-0.1.80 → basedpl-0.1.82}/src/host.rs +0 -0
  403. {basedpl-0.1.80 → basedpl-0.1.82}/src/host_web.rs +0 -0
  404. {basedpl-0.1.80 → basedpl-0.1.82}/src/image/codecs.rs +0 -0
  405. {basedpl-0.1.80 → basedpl-0.1.82}/src/image/imageio.rs +0 -0
  406. {basedpl-0.1.80 → basedpl-0.1.82}/src/image.rs +0 -0
  407. {basedpl-0.1.80 → basedpl-0.1.82}/src/inspection.rs +0 -0
  408. {basedpl-0.1.80 → basedpl-0.1.82}/src/jit.rs +0 -0
  409. {basedpl-0.1.80 → basedpl-0.1.82}/src/js.rs +0 -0
  410. {basedpl-0.1.80 → basedpl-0.1.82}/src/json.rs +0 -0
  411. {basedpl-0.1.80 → basedpl-0.1.82}/src/keyed.rs +0 -0
  412. {basedpl-0.1.80 → basedpl-0.1.82}/src/lib.rs +0 -0
  413. {basedpl-0.1.80 → basedpl-0.1.82}/src/linear.rs +0 -0
  414. {basedpl-0.1.80 → basedpl-0.1.82}/src/name.rs +0 -0
  415. {basedpl-0.1.80 → basedpl-0.1.82}/src/number.rs +0 -0
  416. {basedpl-0.1.80 → basedpl-0.1.82}/src/number_theory.rs +0 -0
  417. {basedpl-0.1.80 → basedpl-0.1.82}/src/optimize.rs +0 -0
  418. {basedpl-0.1.80 → basedpl-0.1.82}/src/pervasive.rs +0 -0
  419. {basedpl-0.1.80 → basedpl-0.1.82}/src/plan.rs +0 -0
  420. {basedpl-0.1.80 → basedpl-0.1.82}/src/plot.rs +0 -0
  421. {basedpl-0.1.80 → basedpl-0.1.82}/src/polynomial.rs +0 -0
  422. {basedpl-0.1.80 → basedpl-0.1.82}/src/primitive/indexing.rs +0 -0
  423. {basedpl-0.1.80 → basedpl-0.1.82}/src/primitive/numeric.rs +0 -0
  424. {basedpl-0.1.80 → basedpl-0.1.82}/src/primitive/search.rs +0 -0
  425. {basedpl-0.1.80 → basedpl-0.1.82}/src/primitive/structural.rs +0 -0
  426. {basedpl-0.1.80 → basedpl-0.1.82}/src/primitive.rs +0 -0
  427. {basedpl-0.1.80 → basedpl-0.1.82}/src/program/blocks.rs +0 -0
  428. {basedpl-0.1.80 → basedpl-0.1.82}/src/program/contraction.rs +0 -0
  429. {basedpl-0.1.80 → basedpl-0.1.82}/src/program/layout.rs +0 -0
  430. {basedpl-0.1.80 → basedpl-0.1.82}/src/program/run.rs +0 -0
  431. {basedpl-0.1.80 → basedpl-0.1.82}/src/program/trace.rs +0 -0
  432. {basedpl-0.1.80 → basedpl-0.1.82}/src/program/verify.rs +0 -0
  433. {basedpl-0.1.80 → basedpl-0.1.82}/src/program.rs +0 -0
  434. {basedpl-0.1.80 → basedpl-0.1.82}/src/protocol.rs +0 -0
  435. {basedpl-0.1.80 → basedpl-0.1.82}/src/reference.rs +0 -0
  436. {basedpl-0.1.80 → basedpl-0.1.82}/src/regex.rs +0 -0
  437. {basedpl-0.1.80 → basedpl-0.1.82}/src/search.rs +0 -0
  438. {basedpl-0.1.80 → basedpl-0.1.82}/src/selection.rs +0 -0
  439. {basedpl-0.1.80 → basedpl-0.1.82}/src/settings.rs +0 -0
  440. {basedpl-0.1.80 → basedpl-0.1.82}/src/syntax.rs +0 -0
  441. {basedpl-0.1.80 → basedpl-0.1.82}/src/system.rs +0 -0
  442. {basedpl-0.1.80 → basedpl-0.1.82}/src/timing.rs +0 -0
  443. {basedpl-0.1.80 → basedpl-0.1.82}/src/transform.rs +0 -0
  444. {basedpl-0.1.80 → basedpl-0.1.82}/src/xml.rs +0 -0
  445. {basedpl-0.1.80 → basedpl-0.1.82}/tests/common/mod.rs +0 -0
  446. {basedpl-0.1.80 → basedpl-0.1.82}/tests/conftest.py +0 -0
  447. {basedpl-0.1.80 → basedpl-0.1.82}/tests/core.rs +0 -0
  448. {basedpl-0.1.80 → basedpl-0.1.82}/tests/derivatives.rs +0 -0
  449. {basedpl-0.1.80 → basedpl-0.1.82}/tests/explain.rs +0 -0
  450. {basedpl-0.1.80 → basedpl-0.1.82}/tests/instructions.txt +0 -0
  451. {basedpl-0.1.80 → basedpl-0.1.82}/tests/jit.rs +0 -0
  452. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/LICENSE-aplcart +0 -0
  453. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/LICENSE-april +0 -0
  454. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/LICENSE-bqn +0 -0
  455. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/LICENSE-bqncrate +0 -0
  456. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/LICENSE-dyalog +0 -0
  457. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/LICENSE-ngn +0 -0
  458. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/README.md +0 -0
  459. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/aplcart.bpl +0 -0
  460. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/april.bpl +0 -0
  461. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/bqn.bpl +0 -0
  462. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/core.bpl +0 -0
  463. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/distributions.bpl +0 -0
  464. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/dyalog.bpl +0 -0
  465. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/graphics.bpl +0 -0
  466. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/lib.bpl +0 -0
  467. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/ngn.bpl +0 -0
  468. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/regex.bpl +0 -0
  469. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/static-int32.bpl +0 -0
  470. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/static.bpl +0 -0
  471. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/support/april.bpl +0 -0
  472. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/support/avl.bpl +0 -0
  473. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/support/redblack.bpl +0 -0
  474. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/support/sbst.bpl +0 -0
  475. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference/support/splay.bpl +0 -0
  476. {basedpl-0.1.80 → basedpl-0.1.82}/tests/reference.rs +0 -0
  477. {basedpl-0.1.80 → basedpl-0.1.82}/tests/scaling.rs +0 -0
  478. {basedpl-0.1.80 → basedpl-0.1.82}/tests/settings.rs +0 -0
  479. {basedpl-0.1.80 → basedpl-0.1.82}/tests/speed/README.md +0 -0
  480. {basedpl-0.1.80 → basedpl-0.1.82}/tests/speed/arrays.bpl +0 -0
  481. {basedpl-0.1.80 → basedpl-0.1.82}/tests/speed/calls.bpl +0 -0
  482. {basedpl-0.1.80 → basedpl-0.1.82}/tests/speed/images.bpl +0 -0
  483. {basedpl-0.1.80 → basedpl-0.1.82}/tests/speed/maps.bpl +0 -0
  484. {basedpl-0.1.80 → basedpl-0.1.82}/tests/speed/models.bpl +0 -0
  485. {basedpl-0.1.80 → basedpl-0.1.82}/tests/speed/structure.bpl +0 -0
  486. {basedpl-0.1.80 → basedpl-0.1.82}/tests/speed/tables.bpl +0 -0
  487. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_basic.py +0 -0
  488. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_bpltests.py +0 -0
  489. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_glyphs.py +0 -0
  490. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_graphics.py +0 -0
  491. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_install.py +0 -0
  492. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_instructions.py +0 -0
  493. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_ipython.py +0 -0
  494. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_keylayout.py +0 -0
  495. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_notebooks.py +0 -0
  496. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_reference.py +0 -0
  497. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_windows_keyboard.py +0 -0
  498. {basedpl-0.1.80 → basedpl-0.1.82}/tests/test_worker.py +0 -0
  499. {basedpl-0.1.80 → basedpl-0.1.82}/tests/units.rs +0 -0
  500. {basedpl-0.1.80 → basedpl-0.1.82}/tests/wasm-pkg.mjs +0 -0
  501. {basedpl-0.1.80 → basedpl-0.1.82}/tests/wasm-speed.mjs +0 -0
  502. {basedpl-0.1.80 → basedpl-0.1.82}/tests/wasm.mjs +0 -0
  503. {basedpl-0.1.80 → basedpl-0.1.82}/tests/windows_keyboard.c +0 -0
  504. {basedpl-0.1.80 → basedpl-0.1.82}/wheel/data/share/jupyter/kernels/bpl/kernel.json +0 -0
@@ -99,7 +99,7 @@ checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5"
99
99
 
100
100
  [[package]]
101
101
  name = "basedpl"
102
- version = "0.1.80"
102
+ version = "0.1.82"
103
103
  dependencies = [
104
104
  "base64 0.23.1",
105
105
  "bytemuck",
@@ -148,7 +148,7 @@ dependencies = [
148
148
 
149
149
  [[package]]
150
150
  name = "basedpl-cli"
151
- version = "0.1.80"
151
+ version = "0.1.82"
152
152
  dependencies = [
153
153
  "async-trait",
154
154
  "basedpl",
@@ -162,7 +162,7 @@ dependencies = [
162
162
 
163
163
  [[package]]
164
164
  name = "basedpl-py"
165
- version = "0.1.80"
165
+ version = "0.1.82"
166
166
  dependencies = [
167
167
  "basedpl",
168
168
  "ctrlc",
@@ -180,7 +180,7 @@ dependencies = [
180
180
 
181
181
  [[package]]
182
182
  name = "basedpl-wasm"
183
- version = "0.1.80"
183
+ version = "0.1.82"
184
184
  dependencies = [
185
185
  "basedpl",
186
186
  "js-sys",
@@ -2464,7 +2464,7 @@ checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
2464
2464
 
2465
2465
  [[package]]
2466
2466
  name = "xtask"
2467
- version = "0.1.80"
2467
+ version = "0.1.82"
2468
2468
  dependencies = [
2469
2469
  "anyhow",
2470
2470
  "rustymath",
@@ -5,7 +5,7 @@ members = ["py"]
5
5
  join_comments = true
6
6
 
7
7
  [workspace.package]
8
- version = "0.1.80"
8
+ version = "0.1.82"
9
9
  edition = "2024"
10
10
  rust-version = "1.98"
11
11
  license = "Apache-2.0"
@@ -325,7 +325,7 @@ The Jupyter adapter in `cli/src/kernel.rs` uses kernmini and a `ThreadWorker`. I
325
325
 
326
326
  Browser `Session.run` streams MIME events and returns a protocol error or null. `eval` transfers values through `js.rs` but discards output and cannot export BPL functions/operators; `bind` imports page values/functions. Typed arrays transfer without another page-worker copy. JavaScript functions live in a thread-local registry and core function nodes hold slots, preserving Send/Sync values. `host_web.rs` implements the browser's clock, synchronous I/O/fetch and RegExp behaviour. File/URL reads resolve against the configured base. Unsupported native filesystem/locale operations stay unavailable; browser `•nput` writes only stdout and `•js` is browser-only.
327
327
 
328
- The playground and gallery load released assets from jsDelivr, or local `nbs/playground/` assets on localhost. Shared `bpl.js` owns editors, worker startup and output. Restarting a trapped/stopped worker loses its state. `worker.js`, `page.js` and `gallery.js` own their respective protocols/UI; `nbs/driver.js` documents canvas drawing data. Gallery demos are `.bpl` sources with shared preferences, checked natively by `language_examples`. Browser recursion tests cover both V8 compilers and fail with LIMIT before stack exhaustion.
328
+ The playground and gallery load released assets from jsDelivr, or local `nbs/playground/` assets on localhost. Shared `bpl.js` owns editors, worker startup and output. The authored ES modules and font in `python/basedpl/browser/` need no evaluator: `browser/bpl-editor.js` exports grammar/configuration/editor options/font installation and explicit `install()`. Importing data never mounts the bar. Solveit, the playground and the gallery supply a normal-flow `#bpl-toolbar` slot; elsewhere the same component overlays the page without padding or height adjustment. One persisted collapse button keeps keyboard input active. `install()` reuses a connected controller; its `dispose()` closes it. Python magics call Solveit's `window.loadBplInput()` when present, otherwise import the same public module from jsDelivr. Restarting a trapped/stopped worker loses its state. `worker.js`, `page.js` and `gallery.js` own their respective protocols/UI; `nbs/driver.js` documents canvas drawing data. Gallery demos are `.bpl` sources with shared preferences, checked natively by `language_examples`. Browser recursion tests cover both V8 compilers and fail with LIMIT before stack exhaustion.
329
329
 
330
330
  CI's two `wasm` jobs, in the `Test` and `Speed` workflows, take Node's version from `.node-version`. TurboFan's frame sizes vary between V8 versions by enough to decide whether a recursion test overflows. On 28 October 2026, one build's `each` shape needed 0.68 MB of stack to reach 171 levels under Node 24's TurboFan, against 0.62 MB under Node 26's. `tests/wasm.mjs` runs its depth checks with Node's 192 KB reserve plus 80% of the roughly 470 KB that a Chrome worker gives, 0.5575 MB in all. A build whose frames grow into the remaining 20% fails the test. CI's x86-64 V8 takes more stack per level than Apple silicon's. The browser's depth limit, `MAX_CALL_DEPTH` in `src/eval.rs`, allows for levels up to 1.48 times their size on Apple silicon. `basedpl.bpltests.wasm_stack(DIR)` measures the stack that each recursion shape takes per level and below its first level. The limit is set from those figures. In wasm, `Binder::reduce` and `Bindings::enter` stay out of line, to keep their locals out of the frames that stay on the stack at every level of recursion. To find a frame that grew, print each function's TurboFan frame size, in "stack slots", with `node --no-liftoff --print-wasm-code-function-index=N`. `wasm_stack` runs each trial in a fresh `node` process whose worker compiles the module, as the test's worker does. Code compiled once and shared across workers gets different frames.
331
331
 
@@ -362,9 +362,9 @@ nbdev-test nbs/dyalog.ipynb --flags dyalog
362
362
  nbdev-preview
363
363
  ```
364
364
 
365
- Quarto renders saved outputs. `bpl-nb --save` updates notebook outputs without changing execution counts. Use it for BPL examples/figures and `nbdev-test` for Python notebook code. Rust `language_examples` checks BPL page/gallery examples; pytest checks Python page examples. Use `BASEDPL_PAGE` to focus page checks. Don't run a full documentation build for routine output updates. Before a release, `bpl-tests prerelease` runs editor generation and nbdev's preparation, as "Release" describes.
365
+ Quarto renders saved outputs. `bpl-nb --save` updates notebook outputs without changing execution counts. Use it for BPL examples/figures and `nbdev-test` for Python notebook code. Rust `language_examples` checks BPL page/gallery examples; pytest checks Python page examples. Use `BASEDPL_PAGE` to focus page checks. Don't run a full documentation build for routine output updates. Before a release, `bpl-tests prerelease` runs the normal development build and nbdev's preparation, as "Release" describes.
366
366
 
367
- `basedpl.editors.write()` generates syntax grammars/highlighters, editor templates, keyboard sources/bundles and glyph metadata from shared Rust symbols and keyboard data. It also writes JetBrains assets and Windows `editors/windows/layout.h`. It writes the browser editor module to `wasm/bpl-editor.js`. `cargo wasm` copies that module and `nbs/fonts/SAX2B.woff2` into the npm package and the playground. After a Rust change, run `python -m basedpl.editors` from the shell, because a running kernel keeps its old extension. `layout.json` owns composed input; captured `keyboards.json` supports generation without macOS. `basedpl.keyboards.capture()` refreshes native data when needed, and `keyboards.write()` generates regional macOS bundles/maps. Regenerate keyboard sources through these functions, not one-off kernel code. `basedpl-install` copies packaged fonts and macOS bundles from `python/basedpl/assets` to the user's directories. See `editors/jetbrains/README.md` and `editors/windows/README.md` for target-specific work. Rebuild the common icon only when its design changes.
367
+ `cargo develop` and `ws-sync` run `basedpl.editors` in a fresh Python process after installing the extension and before copying wheel data. It generates grammars/highlighters, editor templates, keyboard bundles and glyph metadata, including Rust-derived `browser/language.js`. JavaScript UI changes are authored modules read directly by Vite: no generator or npm refresh. `cargo wasm` copies the whole browser directory into the npm package and local playground. `browser/layout.json` owns composed input; captured `keyboards.json` supports generation without macOS. `basedpl.keyboards.capture()` refreshes native data when needed, and `keyboards.write()` generates regional macOS bundles/maps. Regenerate keyboard sources through the normal build, not one-off transformations. `basedpl-install` copies packaged fonts and macOS bundles from `python/basedpl/assets` to the user's directories. See `editors/jetbrains/README.md` and `editors/windows/README.md` for target-specific work. Rebuild the common icon only when its design changes.
368
368
 
369
369
  `nbs/bpl.xml`, the APL/BQN grammars and vim rules share generated glyph classes. `hpl.xml` includes BPL and adds Hanzi aliases from the same symbol table. Use `hpl` fences for Hanzi highlighting, `bpl` for Hanzi names. For Hanzi notebooks, set `kernelspec.language` to `hpl` and keep `kernelspec.name` as `bpl`. These labels do not enable runtime Hanzi aliases. TextMate exports feed Monaco/Shiki. `fonts.css` owns the BPL/APL font choices; rerun affected magics after changing them. `tests/highlighting.mjs`, `input.mjs`, keylayout/Windows tests and glyph-page checks cover their respective generated interfaces. All artifact generation belongs in repository functions/scripts, not ad hoc kernel transformations.
370
370
 
@@ -372,7 +372,7 @@ Quarto renders saved outputs. `bpl-nb --save` updates notebook outputs without c
372
372
 
373
373
  Before approval, verify successful tests for the release commit and the relevant installed artifacts. Reserve isolated wheel installs for packaging-sensitive work or release preparation, using a small relevant subset of existing tests. `ship-rs-build --profile dist` builds the distributed configuration; bare `ship-rs-build` uses release for local checks.
374
374
 
375
- Before each release, run `bpl-tests prerelease` from basedpl's root, in a shell rather than a kernel, while no one else is editing either repository. It runs both repositories' release checks and saves. First come the builds, tests and saves, in parallel, with each step starting once the steps whose output it reads have passed. In each repository these are `cargo develop`, `pytest -q`, `nbdev-prepare`, and `cargo test --profile checked` in a target directory of its own. basedpl adds editor generation, the Node input and highlighting tests, and `bpl-nb --save`. `target_builds` runs beside them, followed by `wasm_test` on its browser build. Then the timings run one at a time, with nothing else running: `cargo test` in each repository with `<NAME>_COSTS` set, rustymath's Python speed test, `thread_scaling` and the browser speed test. Last, `nbdev-clean` runs in both repositories, even after a failure. The first failure ends the run, unless `--keep-going` is given. The summary gives each step's status, time and log. `--dry-run` lists the steps in their order without running them. Before it starts, the run stops if `node_modules` or the Node version that `.node-version` names is missing. It also notes when basedpl needs an unreleased rustymath version, because rustymath then ships first. The run never commits, pushes or tags.
375
+ Before each release, run `bpl-tests prerelease` from basedpl's root, in a shell rather than a kernel, while no one else is editing either repository. It runs both repositories' release checks and saves. First come the builds, tests and saves, in parallel, with each step starting once the steps whose output it reads have passed. In each repository these are `cargo develop`, `pytest -q`, `nbdev-prepare`, and `cargo test --profile checked` in a target directory of its own. basedpl's development build includes editor generation; its Node tests, notebooks and `target_builds` wait for that fresh data. Browser tests follow `target_builds`. Then the timings run one at a time, with nothing else running: `cargo test` in each repository with `<NAME>_COSTS` set, rustymath's Python speed test, `thread_scaling` and the browser speed test. Last, `nbdev-clean` runs in both repositories, even after a failure. The first failure ends the run, unless `--keep-going` is given. The summary gives each step's status, time and log. `--dry-run` lists the steps in their order without running them. Before it starts, the run stops if `node_modules` or the Node version that `.node-version` names is missing. It also notes when basedpl needs an unreleased rustymath version, because rustymath then ships first. The run never commits, pushes or tags.
376
376
 
377
377
  The run's `cargo test --profile checked` uses the test profile with debug assertions on, which adds `session()`'s turn check and the standard library's checks in unsafe code. Those checks cost 12 to 55% per call, too much for the test profile that the budgets measure. The speed and scaling tests mark themselves ignored under debug assertions, so that run checks correctness only.
378
378
 
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basedpl
3
- Version: 0.1.80
3
+ Version: 0.1.82
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Requires-Dist: fastcore
7
7
  Requires-Dist: jupyter-core
8
8
  Requires-Dist: fastship>=0.0.11 ; extra == 'dev'
9
- Requires-Dist: fastws-cli>=0.0.29 ; extra == 'dev'
9
+ Requires-Dist: fastws-cli>=0.0.32 ; extra == 'dev'
10
10
  Requires-Dist: maturin>=1.13,<2.0 ; extra == 'dev'
11
11
  Requires-Dist: pytest ; extra == 'dev'
12
12
  Requires-Dist: pytest-timeout ; extra == 'dev'
@@ -22,7 +22,7 @@ Remove the layout from your keyboard list before updating it. If Windows reports
22
22
 
23
23
  ## Build
24
24
 
25
- `basedpl.editors.write()` generates `layout.h` from `python/basedpl/layout.json` during `bpl-tests prerelease`. `keyboard.c` supplies the standard US scan-code and modifier tables.
25
+ `basedpl.editors.write()` generates `layout.h` from `python/basedpl/browser/layout.json` during `cargo develop`. `keyboard.c` supplies the standard US scan-code and modifier tables.
26
26
 
27
27
  Install Microsoft's [C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/) with **C++ core build tools**, **MSVC x64/x86**, **MSVC ARM64**, **MSVC ARM64EC** and a **Windows SDK**. From the repository, run:
28
28
 
@@ -10,3 +10,4 @@
10
10
  /playground/canvas.js
11
11
  /playground/bpl-editor.js
12
12
  /playground/SAX2B.woff2
13
+ /playground/browser/
@@ -11,6 +11,6 @@ from basedpl.font import build
11
11
  build()
12
12
  ```
13
13
 
14
- This writes installable TTF files and licences into `python/basedpl/assets/fonts`, and WOFF2 files into `nbs/fonts`. Run `basedpl-install` to install both fonts for your user. The source versions are pinned in `basedpl.font`. BQN386B has its own family name to distinguish it from an installed upstream BQN386.
14
+ This writes installable TTF files and licences into `python/basedpl/assets/fonts`, SAX2B's WOFF2 into `python/basedpl/browser`, and BQN386B's WOFF2 into `nbs/fonts`. Run `basedpl-install` to install both fonts for your user. The source versions are pinned in `basedpl.font`. BQN386B has its own family name to distinguish it from an installed upstream BQN386.
15
15
 
16
16
  The BPL symbols `⇄`, `∂`, and `⨸` are still missing from SAX2B.
@@ -1,6 +1,6 @@
1
1
  /* Code fonts for the magics and the docs. The docs load this file through the symlink nbs/fonts.css. */
2
2
  :root { --bpl-font: SAX2B; --apl-font: BQN386B; }
3
- @font-face { font-family: SAX2B; src: url("https://cdn.jsdelivr.net/gh/AnswerDotAI/basedpl@main/nbs/fonts/SAX2B.woff2") format("woff2"); }
3
+ @font-face { font-family: SAX2B; src: url("https://cdn.jsdelivr.net/gh/AnswerDotAI/basedpl@main/python/basedpl/browser/SAX2B.woff2") format("woff2"); }
4
4
  @font-face { font-family: BQN386B; src: local("BQN386B"), url("https://cdn.jsdelivr.net/gh/AnswerDotAI/basedpl@main/nbs/fonts/BQN386B.woff2") format("woff2"); }
5
5
  .bpl_out { font-family: var(--bpl-font), monospace !important; line-height: 1.05 !important; }
6
6
  .bpl_page_bar { --bpl-bar-background: #eee; --bpl-bar-color: #111; }
@@ -9,6 +9,7 @@ Choose a demo to run it. The **Code** tab holds its BPL, which you can edit and
9
9
 
10
10
  ::: {.column-screen-inset-right}
11
11
  ```{=html}
12
+ <div id="bpl-toolbar"></div>
12
13
  <div id="gallery">
13
14
  <nav id="demos" class="nav nav-pills flex-column">
14
15
  <a class="nav-link" href="#attractor"></a>
@@ -31,15 +31,14 @@
31
31
  },
32
32
  "outputs": [],
33
33
  "source": [
34
- "import html, json, re, basedpl\n",
35
- "from importlib.resources import files\n",
34
+ "import html, re, basedpl\n",
36
35
  "from fastcore.utils import *\n",
37
36
  "from basedpl import symbols\n",
38
37
  "from basedpl.ipython import load_ipython_extension as _load_help\n",
39
38
  "from IPython.core.completer import context_matcher, SimpleCompletion\n",
40
39
  "from IPython import get_ipython\n",
41
- "from IPython.display import display, Javascript, HTML\n",
42
- "from IPython.paths import get_ipython_dir\n"
40
+ "from IPython.display import display, Javascript\n",
41
+ "from IPython.paths import get_ipython_dir"
43
42
  ]
44
43
  },
45
44
  {
@@ -156,7 +155,7 @@
156
155
  "id": "793cb644",
157
156
  "metadata": {},
158
157
  "source": [
159
- "The language bar and the font stylesheet, `fonts.css`, are loaded once for each magic instance."
158
+ "Each execution emits a small CDN script load. The browser keeps one toolbar, including when a dialog is reopened on the same kernel."
160
159
  ]
161
160
  },
162
161
  {
@@ -171,26 +170,7 @@
171
170
  "outputs": [],
172
171
  "source": [
173
172
  "class BPLMagic:\n",
174
- " \"IPython BPL magics that evaluate in the workspace `basedpl.bpl`.\"\n",
175
- " def __init__(self): self._loaded = False\n"
176
- ]
177
- },
178
- {
179
- "cell_type": "code",
180
- "execution_count": null,
181
- "id": "940136d6",
182
- "metadata": {},
183
- "outputs": [],
184
- "source": [
185
- "#| export\n",
186
- "@patch\n",
187
- "def _load(self:BPLMagic):\n",
188
- " if self._loaded: return\n",
189
- " js = files('basedpl')\n",
190
- " layout = (files('basedpl')/'layout.json').read_text()\n",
191
- " display(Javascript(f\"{(js/'lb.js').read_text()}({json.dumps(symbols)}, {(js/'input.js').read_text()}, {layout}).page(window.monaco)\"))\n",
192
- " display(HTML(f\"<style>{(js/'fonts.css').read_text()}</style>\"))\n",
193
- " self._loaded = True"
173
+ " \"IPython BPL magics that evaluate in the workspace `basedpl.bpl`.\""
194
174
  ]
195
175
  },
196
176
  {
@@ -204,7 +184,8 @@
204
184
  "@patch\n",
205
185
  "def bpl(self:BPLMagic, line, cell=None):\n",
206
186
  " \"Evaluate a line as a native value or display a cell as a BPL session.\"\n",
207
- " self._load()\n",
187
+ " display(Javascript(r'''if (window.loadBplInput) window.loadBplInput();\n",
188
+ "else import('https://cdn.jsdelivr.net/npm/basedpl/browser/bpl-editor.js').then(m => m.install());'''))\n",
208
189
  " code = line if cell is None else cell.rstrip()\n",
209
190
  " show = not (cell is not None and code.endswith(';'))\n",
210
191
  " if not show: code = code[:-1]\n",
@@ -1352,10 +1333,11 @@
1352
1333
  "source": [
1353
1334
  "#| hide\n",
1354
1335
  "with capture_output() as cap: magic.bpl('', 'quiet←9 ⋄ ⎕←quiet;')\n",
1355
- "test_eq(len(cap.outputs), 0)\n",
1336
+ "test_eq(len(cap.outputs), 1)\n",
1337
+ "assert 'application/javascript' in cap.outputs[0].data\n",
1356
1338
  "test_eq(magic.bpl('quiet').py, 9)\n",
1357
1339
  "with capture_output() as cap: magic.bpl('', 'quiet ⋄ quiet+1')\n",
1358
- "assert '9' in cap.outputs[0].data['text/html'] and '10' in cap.outputs[1].data['text/html']"
1340
+ "assert '9' in cap.outputs[-2].data['text/html'] and '10' in cap.outputs[-1].data['text/html']"
1359
1341
  ]
1360
1342
  },
1361
1343
  {
@@ -1435,10 +1417,10 @@
1435
1417
  "outputs": [],
1436
1418
  "source": [
1437
1419
  "with capture_output() as cap: magic.bpl(']help double')\n",
1438
- "assert 'Double the argument' in cap.outputs[0].data['text/markdown']\n",
1420
+ "assert 'Double the argument' in cap.outputs[-1].data['text/markdown']\n",
1439
1421
  "with capture_output() as cap: magic.bpl('', ']help double -source')\n",
1440
- "assert '⎕←\"called\"' in cap.outputs[0].data['text/markdown']\n",
1441
- "test_eq(len(cap.outputs), 1)"
1422
+ "assert '⎕←\"called\"' in cap.outputs[-1].data['text/markdown']\n",
1423
+ "test_eq(len(cap.outputs), 2)"
1442
1424
  ]
1443
1425
  },
1444
1426
  {
@@ -1499,7 +1481,7 @@
1499
1481
  "outputs": [],
1500
1482
  "source": [
1501
1483
  "with capture_output() as cap: test_fail(lambda: magic.bpl('', '⎕←42 ⋄ 1÷\"a\"'), contains='DOMAIN ERROR')\n",
1502
- "assert '42' in cap.outputs[0].data['text/html']\n",
1484
+ "assert '42' in cap.outputs[-1].data['text/html']\n",
1503
1485
  "test_fail(lambda: magic.bpl('', '{⍵+1'), contains='SYNTAX ERROR')\n",
1504
1486
  "test_eq(magic.bpl('quiet').py, 9)"
1505
1487
  ]
@@ -23,7 +23,8 @@ const css = getComputedStyle(document.documentElement), color = cls => {
23
23
  const value = css.getPropertyValue(`--quarto-hl-${cls}-color`).trim();
24
24
  return value === 'inherit' ? color('kw') : value;
25
25
  };
26
- const grammar = JSON.parse(await text('bpl.tmLanguage.json'));
26
+ const bplEditor = await import(new URL('browser/bpl-editor.js', pkg).href);
27
+ const {grammar} = bplEditor;
27
28
  const classes = [['comment', 'co'], ['string.quoted.double', 'st'], ['string.quoted.single', 'ch'], ['constant.numeric', 'dv'],
28
29
  ['support.function', 'fu'], ['keyword.operator.monadic', 'op'],
29
30
  ['keyword.operator.dyadic', 'ex'], ['variable.parameter', 'va'], ['keyword.control', 'kw']];
@@ -103,11 +104,8 @@ export function display(out, data) {
103
104
  }
104
105
 
105
106
  let bar;
106
- // The language bar from `lb.js`, which needs the glyph rows, `input.js` and the key layout.
107
- async function addBar(symbols) {
108
- const [lb, input, layout] = await Promise.all([script('lb.js'), script('input.js'), text('layout.json')]);
109
- lb(symbols, input, JSON.parse(layout)).page(monaco);
110
- }
107
+ // The same standalone input component used by notebooks and other hosts.
108
+ function addBar() { return bplEditor.install(); }
111
109
 
112
110
  // Runs BPL in a worker, which holds one session. `run(code)` runs code, and `on` gets each message about it: `output`, then `reply` with
113
111
  // the error or `null`. `eval(code)` returns a promise of the code's value, which rejects with the BPL error. `on` also gets `panic` and
@@ -121,7 +119,7 @@ export function interpreter(on) {
121
119
  worker = new Worker(new URL(`worker.js?pkg=${encodeURIComponent(pkg)}`, import.meta.url), { type: 'module' });
122
120
  worker.onmessage = ({ data }) => {
123
121
  if (data.type === 'ready') {
124
- bar ??= addBar(data.symbols);
122
+ bar ??= addBar();
125
123
  ready = true;
126
124
  for (const message of waiting) worker.postMessage(message);
127
125
  return;
@@ -9,6 +9,7 @@ Press **▶ Run**, or Ctrl-Enter (Cmd-Enter on a Mac), to run the code. Type a b
9
9
  The interpreter runs in your browser. It is the latest release of the npm package [`basedpl`](https://www.npmjs.com/package/basedpl). Names you create are persistent between runs. **⏹ Stop** ends the session and starts a new one.
10
10
 
11
11
  ```{=html}
12
+ <div id="bpl-toolbar"></div>
12
13
  <div id="playground">
13
14
  <div id="history"></div>
14
15
  <div class="playground-editor">
@@ -50,7 +50,7 @@ Expansion applies only to typed REPL input, outside strings and comments. Pasted
50
50
 
51
51
  ### Other editors
52
52
 
53
- The shared table is `python/basedpl/layout.json`, shipped in the Python package and embedded in the Rust REPL. `option` gives what each Alt key types: a glyph, or a dead-key state that the next key completes. Each state in `states` lists its keys, and the terminator that Space or an unlisted key types. Follow-up matching ignores Alt. Repeating the prefix key types its terminator and ends the sequence. Keys are US characters after Shift. `alt_aliases` maps actual Alt characters such as `£` to text for the REPL and notebook keyboard. Native macOS layouts ignore these aliases. `basedpl.editors.write()` builds the regional macOS layout bundles in `python/basedpl/assets/macos` from the same file and the native maps in `keyboards.json`.
53
+ The shared table is `python/basedpl/browser/layout.json`, shipped in the Python package and embedded in the Rust REPL. `option` gives what each Alt key types: a glyph, or a dead-key state that the next key completes. Each state in `states` lists its keys, and the terminator that Space or an unlisted key types. Follow-up matching ignores Alt. Repeating the prefix key types its terminator and ends the sequence. Keys are US characters after Shift. `alt_aliases` maps actual Alt characters such as `£` to text for the REPL and notebook keyboard. Native macOS layouts ignore these aliases. `basedpl.editors.write()` builds the regional macOS layout bundles in `python/basedpl/assets/macos` from the same file and the native maps in `keyboards.json`.
54
54
 
55
55
  ```python
56
56
  import json
@@ -742,18 +742,20 @@
742
742
  "id": "34b9099d",
743
743
  "metadata": {},
744
744
  "source": [
745
- "`lb.js` adds a bar of BPL's glyphs to a page. Click a glyph to type it into the editor you used last. In a textarea marked with `data-bpl`, or a Monaco editor whose language is `bpl`, you can also type a backtick followed by a glyph's name, as in the BPL REPL. `lb.js` and `input.js` are scripts whose value is a function. Give the bar the glyph rows from `symbols()` and the key layout from `layout.json`:\n",
745
+ "Load the symbol bar and font without the BPL interpreter:\n",
746
746
  "\n",
747
- "```js\n",
748
- "import init, { symbols } from 'https://cdn.jsdelivr.net/npm/basedpl/basedpl_wasm.js';\n",
749
- "\n",
750
- "const text = name => fetch(`https://cdn.jsdelivr.net/npm/basedpl/${name}`).then(r => r.text());\n",
751
- "const [lb, input, layout] = await Promise.all(['lb.js', 'input.js', 'layout.json'].map(text));\n",
752
- "await init();\n",
753
- "(0, eval)(lb)(JSON.parse(symbols()), (0, eval)(input), JSON.parse(layout));\n",
747
+ "```html\n",
748
+ "<script type=\"module\">\n",
749
+ "import {install} from 'https://cdn.jsdelivr.net/npm/basedpl/browser/bpl-editor.js';\n",
750
+ "install();\n",
751
+ "</script>\n",
754
752
  "```\n",
755
753
  "\n",
756
- "`bpl.tmLanguage.json` is a TextMate grammar for BPL, with the scope name `source.bpl`. Use it to highlight BPL code with Shiki, or in any editor that reads TextMate grammars."
754
+ "Solveit, the playground and the gallery provide a normal-flow `#bpl-toolbar` slot. Other pages get the same component as a fixed top overlay without padding or height adjustment. The arrow button collapses or expands the row and remembers the choice for this origin. Collapsing keeps keyboard entry active.\n",
755
+ "\n",
756
+ "Click a glyph to insert it into the last editable BPL input, or type a backtick followed by a glyph's name. The controller recognizes BPL Monaco models, `%%bpl`/`%%apl` bodies, CodeMirror and marked textareas. It reads `window.monaco` when input occurs, so it does not need the editor to be ready when the script loads. `window.bplInput.dispose()` removes the bar and input listeners when a host page closes.\n",
757
+ "\n",
758
+ "`bpl.tmLanguage.json` is available separately for Shiki and other TextMate readers. `browser/bpl-editor.js` exports `grammar`, `configuration`, `editorOptions`, `installFont()` and `install()`. Importing it alone does not mount a bar; repeated `install()` calls reuse the connected controller."
757
759
  ]
758
760
  },
759
761
  {
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "private": true,
3
+ "type": "module",
3
4
  "devDependencies": {
4
5
  "shiki": "^4.5.0"
5
6
  }
@@ -1,5 +1,5 @@
1
1
  [build-system]
2
- requires = ["maturin>=1.13,<2.0", "fastws-cli>=0.0.29"]
2
+ requires = ["maturin>=1.13,<2.0", "fastws-cli>=0.0.32"]
3
3
  build-backend = "fastws.build_backend"
4
4
 
5
5
  [project]
@@ -19,7 +19,7 @@ classifiers = [
19
19
  ]
20
20
 
21
21
  [project.optional-dependencies]
22
- dev = ["fastship>=0.0.11", "fastws-cli>=0.0.29", "maturin>=1.13,<2.0", "pytest", "pytest-timeout", "numpy", "pandas", "ipython>=9.17.1", "nbdev>=3.3.24", "conkernelclient>=0.0.23", "pillow", "rustymath>=0.1.49"]
22
+ dev = ["fastship>=0.0.11", "fastws-cli>=0.0.32", "maturin>=1.13,<2.0", "pytest", "pytest-timeout", "numpy", "pandas", "ipython>=9.17.1", "nbdev>=3.3.24", "conkernelclient>=0.0.23", "pillow", "rustymath>=0.1.49"]
23
23
 
24
24
  [project.scripts]
25
25
  basedpl-install = "basedpl.install:main"
@@ -48,6 +48,7 @@ cache-keys = [{ file = "pyproject.toml" }, { file = "Cargo.toml" }, { file = "cl
48
48
 
49
49
  [tool.fastws]
50
50
  native-binaries = true
51
+ post-develop-module = "basedpl.editors"
51
52
 
52
53
  [tool.fastship]
53
54
  branch = "main"
@@ -182,8 +182,9 @@ class Array(_Operators):
182
182
  if names is not None: self.names = names
183
183
  self._classify()
184
184
  def _classify(self):
185
- "Make this a `FunctionArray` exactly when a direct item is a function."
186
- self.__class__ = FunctionArray if self._inner.holds_functions else Array
185
+ "Classify built-in array wrappers without changing user-defined subclasses."
186
+ if type(self) in (Array, FunctionArray):
187
+ self.__class__ = FunctionArray if self._inner.holds_functions else Array
187
188
  @property
188
189
  def shape(self): return tuple(self._inner.shape)
189
190
  @property
@@ -32,8 +32,6 @@ d = { 'settings': { 'branch': 'main',
32
32
  'basedpl.notebooks.AplOut.__repr__': ('magics.html#aplout.__repr__', 'basedpl/notebooks.py'),
33
33
  'basedpl.notebooks.AplOut._repr_html_': ('magics.html#aplout._repr_html_', 'basedpl/notebooks.py'),
34
34
  'basedpl.notebooks.BPLMagic': ('magics.html#bplmagic', 'basedpl/notebooks.py'),
35
- 'basedpl.notebooks.BPLMagic.__init__': ('magics.html#bplmagic.__init__', 'basedpl/notebooks.py'),
36
- 'basedpl.notebooks.BPLMagic._load': ('magics.html#bplmagic._load', 'basedpl/notebooks.py'),
37
35
  'basedpl.notebooks.BPLMagic.bpl': ('magics.html#bplmagic.bpl', 'basedpl/notebooks.py'),
38
36
  'basedpl.notebooks.BPLMagic.complete': ('magics.html#bplmagic.complete', 'basedpl/notebooks.py'),
39
37
  'basedpl.notebooks.create_ipython_config': ('magics.html#create_ipython_config', 'basedpl/notebooks.py'),
@@ -922,19 +922,18 @@ def _cargo_test(root, *args):
922
922
  def _steps(out, node):
923
923
  "The steps of `prerelease`. Its browser package goes in `out/'wasm'`. `node` is the Node binary that the editor tests run under (`_node`)."
924
924
  B, R, wasm = _ROOT, _RUSTYMATH, str(out/'wasm')
925
- dev, rdev, gen = 'basedpl: cargo develop', 'rustymath: cargo develop', 'basedpl: editors'
925
+ dev, rdev = 'basedpl: cargo develop', 'rustymath: cargo develop'
926
926
  return [
927
927
  _Step(dev, ['cargo', 'develop'], B, timeout=1200),
928
928
  _Step(rdev, ['cargo', 'develop'], R, timeout=1200),
929
- _Step(gen, [sys.executable, '-m', 'basedpl.editors'], B, (dev,), timeout=600),
930
929
  *(_Step(f'{r.name}: checked tests', _cargo_test(r, '--profile', 'checked', '--target-dir', str(r/'target'/'prerelease')), r, timeout=3600) for r in (B, R)),
931
- _Step('target builds', ['bpl-tests', 'target_builds', wasm], B),
932
- _Step('basedpl: pytest', ['pytest', '-q'], B, (gen,), timeout=1200),
930
+ _Step('target builds', ['bpl-tests', 'target_builds', wasm], B, (dev,)),
931
+ _Step('basedpl: pytest', ['pytest', '-q'], B, (dev,), timeout=1200),
933
932
  _Step('rustymath: pytest', ['pytest', '-q', '--ignore', 'tests/test_speed.py'], R, (rdev,), timeout=1200),
934
- *(_Step(f'basedpl: {t} test', [node, f'tests/{t}.mjs'], B, (gen,), timeout=300) for t in ('input', 'highlighting')),
933
+ *(_Step(f'basedpl: {t} test', [node, f'tests/{t}.mjs'], B, (dev,), timeout=300) for t in ('input', 'highlighting')),
935
934
  _Step('basedpl: browser tests', ['bpl-tests', 'wasm_test', wasm], B, ('target builds',), timeout=900),
936
935
  _Step('basedpl: BPL notebooks', ['bpl-nb', '--save'], B, (dev,)),
937
- _Step('basedpl: nbdev', ['nbdev-prepare'], B, (gen, 'basedpl: BPL notebooks')),
936
+ _Step('basedpl: nbdev', ['nbdev-prepare'], B, (dev, 'basedpl: BPL notebooks')),
938
937
  _Step('rustymath: nbdev', ['nbdev-prepare'], R, (rdev,)),
939
938
  _Step('basedpl: cargo test', _cargo_test(B), B, (dev,), dict(BASEDPL_COSTS='1'), 3600, True),
940
939
  _Step('rustymath: cargo test', _cargo_test(R), R, (rdev,), dict(RUSTYMATH_COSTS='1'), 3600, True),
@@ -0,0 +1,32 @@
1
+ import {grammar, symbols} from './language.js';
2
+ import input from './input.js';
3
+ import languageBar from './lb.js';
4
+ import layout from './layout.json' with {type: 'json'};
5
+
6
+ export {grammar};
7
+ export const configuration = {
8
+ comments: {lineComment: '⍝'}, brackets: [['(', ')'], ['[', ']'], ['{', '}']],
9
+ autoClosingPairs: [['(', ')'], ['[', ']'], ['{', '}'], ['"', '"'], ["'", "'"]].map(([open, close]) => ({open, close, notIn: ['string', 'comment']})),
10
+ surroundingPairs: [['(', ')'], ['[', ']'], ['{', '}'], ['"', '"'], ["'", "'"]].map(([open, close]) => ({open, close})),
11
+ };
12
+ export const editorOptions = {fontFamily: 'SAX2B, monospace', unicodeHighlight: {ambiguousCharacters: false}};
13
+ const font = new URL('./SAX2B.woff2', import.meta.url);
14
+ const mount = languageBar(symbols, input, layout, editorOptions);
15
+
16
+ export function installFont(doc = document) {
17
+ if (doc.getElementById('bpl-font')) return;
18
+ const style = doc.createElement('style');
19
+ style.id = 'bpl-font';
20
+ style.textContent = `@font-face{font-family:SAX2B;src:url("${font}") format("woff2")}`;
21
+ doc.head.append(style);
22
+ }
23
+
24
+ export function install() {
25
+ if (window.bplInput?.element.isConnected) { window.bplInput.fonts(); return window.bplInput; }
26
+ window.bplInput?.dispose();
27
+ installFont();
28
+ const container = document.getElementById('bpl-toolbar');
29
+ window.bplInput = mount(container || document.body);
30
+ if (!container) window.bplInput.element.style.cssText = 'position:fixed;top:0;left:0;right:0;z-index:2147483647';
31
+ return window.bplInput;
32
+ }
@@ -1,4 +1,4 @@
1
- ((symbols, layout) => {
1
+ export default (symbols, layout) => {
2
2
  const comments = new Set(symbols.filter(s => s.kind === 'comment').flatMap(s => [...s.glyph, ...s.hanzi.join('')]));
3
3
  // US physical keys, before macOS Option or another layout transforms event.key.
4
4
  const punctuation = {Backquote: '`~', Minus: '-_', Equal: '=+', BracketLeft: '[{', BracketRight: ']}',
@@ -107,4 +107,4 @@
107
107
  }
108
108
 
109
109
  return {matches, inCode, bplStart, entry, press, reset};
110
- })
110
+ };
@@ -0,0 +1,3 @@
1
+ // Generated by basedpl.editors.browser.
2
+ export const grammar = {"name": "bpl", "displayName": "BPL", "scopeName": "source.bpl", "fileTypes": ["bpl"], "patterns": [{"begin": "[⍝]", "beginCaptures": {"0": {"name": "comment.line.bpl"}}, "end": "$", "contentName": "comment.line.bpl", "patterns": [], "applyEndPatternLast": true}, {"begin": "\"", "beginCaptures": {"0": {"name": "string.quoted.double.bpl"}}, "end": "\"|$", "contentName": "string.quoted.double.bpl", "patterns": [{"match": "\"\"", "name": "string.quoted.double.bpl"}], "applyEndPatternLast": true, "endCaptures": {"0": {"name": "string.quoted.double.bpl"}}}, {"match": "'.?'", "name": "string.quoted.single.bpl"}, {"match": "(?:_\\d+|_\\S|_|[^\\s\\p{Cc}0-9←⎕•⍺⍵⍶⍹∇⍢⍝⋄⁝\\?¯∞⍬\\+\\-×÷⌈⌊\\|\\*⍟○π√!∧∨⊼⊽\\~=≠<≤>≥⍳↦:⍴≢≡,⍪⊂⊃⊆∊∪∩⍋⍒↑↓⌽⊖⍉⊤⊥⍎⍕⌷⌹\\#↕⍭⨸⌻⍸⍷⊢⊣¿¨ᵇ⍨↣⍤∘⍠⍥↢\\.⊗⌸⍣⇄⊘@∂⍚⌺/⌿\\\\⍀⁰¹²³⁴⁵⁶⁷⁸⁹⁻ᵀᵘₓ₀₁₂₃₄₅₆₇₈₉₋ₓ₁ₓ₂ₓ₄ₓ₈ₓₕₛₚ\\(\\)\\[\\]\\{\\}'\";\\$_ₑⱼᵣ])+", "name": "variable.other.bpl"}, {"match": "[•][A-Za-z_∆⍙][A-Za-z0-9_∆⍙]*", "name": "support.function.bpl"}, {"match": "(?:[¯]?[∞]|[¯]?(\\d+([.]\\d+)?|[.]\\d+)([eEₑ][¯]?\\d+)?([jJⱼ][¯]?(\\d+([.]\\d+)?|[.]\\d+)([eEₑ][¯]?\\d+)?|[rᵣ][¯]?\\d+)?)(?:ₓ₁|ₓ₂|ₓ₄|ₓ₈|ₓ|ₕ|ₛ|ₚ)?|[ₑⱼᵣ]", "name": "constant.numeric.bpl"}, {"match": "[⍬](?:ₓ₁|ₓ₂|ₓ₄|ₓ₈|ₓ|ₕ|ₛ|ₚ)?", "name": "constant.numeric.bpl"}, {"match": "\\$[tfn]", "name": "constant.numeric.bpl"}, {"match": "\\$[ad]", "name": "string.quoted.double.bpl"}, {"begin": "[\\])](?=(?:ₓ₁|ₓ₂|ₓ₄|ₓ₈|ₓ|ₕ|ₛ|ₚ))", "beginCaptures": {"0": {"name": "source.bpl"}}, "end": "(?:ₓ₁|ₓ₂|ₓ₄|ₓ₈|ₓ|ₕ|ₛ|ₚ)|$", "contentName": "constant.numeric.bpl", "patterns": [], "applyEndPatternLast": true, "endCaptures": {"0": {"name": "constant.numeric.bpl"}}}, {"match": "[\\+\\-×÷⌈⌊\\|\\*⍟○π√!∧∨⊼⊽\\~=≠<≤>≥⍳↦:⍴≢≡,⍪⊂⊃⊆∊∪∩⍋⍒↑↓⌽⊖⍉⊤⊥⍎⍕⌷⌹\\#↕⍭⨸⌻⍸⍷⊢⊣¿]", "name": "support.function.bpl"}, {"match": "(?:ₓ₁|ₓ₂|ₓ₄|ₓ₈|ₓ|ₕ|ₛ|ₚ)", "name": "keyword.operator.monadic.bpl"}, {"match": "[¨ᵇ⍨⊗⌸⇄∂/⌿\\\\⍀⁰¹²³⁴⁵⁶⁷⁸⁹⁻ᵀᵘₓ]", "name": "keyword.operator.monadic.bpl"}, {"match": "[↣⍤∘⍠⍥↢\\.⍣⊘@⍚⌺]", "name": "keyword.operator.dyadic.bpl"}, {"match": "[⍺⍵⍶⍹∇⍢]", "name": "variable.parameter.bpl"}, {"match": "[←⎕⋄⁝\\?₀₁₂₃₄₅₆₇₈₉₋]", "name": "keyword.control.bpl"}]};
3
+ export const symbols = [{"glyph": "←", "name": "left-arrow", "kind": "syntax", "monad": "assign", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["是", "是"], "shortcut": " h"}, {"glyph": "⎕", "name": "quad", "kind": "syntax", "monad": "io", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["出入", "出入"], "shortcut": " q"}, {"glyph": "•", "name": "bullet", "kind": "system", "monad": "system", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["系", "系"], "shortcut": " y"}, {"glyph": "⍺", "name": "alpha", "kind": "argument", "monad": "left-argument", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["甲", "甲"], "shortcut": " a"}, {"glyph": "⍵", "name": "omega", "kind": "argument", "monad": "right-argument", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["乙", "乙"], "shortcut": " w"}, {"glyph": "⍶", "name": "alpha-underbar", "kind": "argument", "monad": "left-operand", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["丙", "丙"], "shortcut": " - a"}, {"glyph": "⍹", "name": "omega-underbar", "kind": "argument", "monad": "right-operand", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["丁", "丁"], "shortcut": " - w"}, {"glyph": "∇", "name": "del", "kind": "argument", "monad": "recursion", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["递", "遞"], "shortcut": " g"}, {"glyph": "⍢", "name": "del-diaeresis", "kind": "argument", "monad": "operator-recursion", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["循", "循"], "shortcut": " 1 g"}, {"glyph": "⍝", "name": "lamp", "kind": "comment", "monad": "comment", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["注", "注"], "shortcut": " o c"}, {"glyph": "⋄", "name": "diamond", "kind": "syntax", "monad": "separator", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["句", "句"], "shortcut": " `"}, {"glyph": "⁝", "name": "tricolon", "kind": "syntax", "monad": "token-separator", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["隔", "隔"], "shortcut": " :"}, {"glyph": "?", "name": "question", "kind": "syntax", "monad": "predicate", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["若", "若"], "shortcut": ""}, {"glyph": "¯", "name": "overbar", "kind": "literal", "monad": "negative", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["负", "負"], "shortcut": " -"}, {"glyph": "∞", "name": "infinity", "kind": "literal", "monad": "", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["永", "永"], "shortcut": " 8"}, {"glyph": "⍬", "name": "zilde", "kind": "literal", "monad": "empty", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["空", "空"], "shortcut": " )"}, {"glyph": "+", "name": "plus", "kind": "function", "monad": "conjugate", "dyad": "add", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["加", "加"], "shortcut": ""}, {"glyph": "-", "name": "minus", "kind": "function", "monad": "negate", "dyad": "subtract", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["减", "減"], "shortcut": ""}, {"glyph": "×", "name": "times", "kind": "function", "monad": "sign", "dyad": "multiply", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["乘号", "乘號"], "shortcut": " m"}, {"glyph": "÷", "name": "obelus", "kind": "function", "monad": "reciprocal", "dyad": "divide", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["除", "除"], "shortcut": " u"}, {"glyph": "⌈", "name": "upstile", "kind": "function", "monad": "ceiling", "dyad": "maximum", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["上", "上"], "shortcut": " s"}, {"glyph": "⌊", "name": "downstile", "kind": "function", "monad": "floor", "dyad": "minimum", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["下", "下"], "shortcut": " d"}, {"glyph": "|", "name": "stile", "kind": "function", "monad": "magnitude", "dyad": "residue", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["绝余", "絕餘"], "shortcut": ""}, {"glyph": "*", "name": "star", "kind": "function", "monad": "exponential", "dyad": "exponent", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["幂", "冪"], "shortcut": ""}, {"glyph": "⍟", "name": "circle-star", "kind": "function", "monad": "natural-log", "dyad": "logarithm", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["对", "對"], "shortcut": " o 8"}, {"glyph": "○", "name": "circle", "kind": "function", "monad": "cis", "dyad": "circular", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["圆", "圓"], "shortcut": " o"}, {"glyph": "π", "name": "pi", "kind": "function", "monad": "pi-times", "dyad": "pi-ratio", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["周", "周"], "shortcut": " p"}, {"glyph": "√", "name": "radical", "kind": "function", "monad": "sqrt", "dyad": "root", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["根", "根"], "shortcut": " 3"}, {"glyph": "!", "name": "exclamation", "kind": "function", "monad": "factorial", "dyad": "binomial", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["阶拣", "階揀"], "shortcut": ""}, {"glyph": "∧", "name": "wedge", "kind": "function", "monad": "polar", "dyad": "and", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["极且", "極且"], "shortcut": " 0"}, {"glyph": "∨", "name": "vee", "kind": "function", "monad": "real-imag", "dyad": "or", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["析或", "析或"], "shortcut": " 9"}, {"glyph": "⊼", "name": "wedge-bar", "kind": "function", "monad": "square", "dyad": "nand", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["方否", "方否"], "shortcut": " - 0"}, {"glyph": "⊽", "name": "vee-bar", "kind": "function", "monad": "double", "dyad": "nor", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["双莫", "雙莫"], "shortcut": " - 9"}, {"glyph": "~", "name": "tilde", "kind": "function", "monad": "not", "dyad": "without", "monad_rank": "0", "dyad_ranks": "∞ ∞", "hanzi": ["非无", "非無"], "shortcut": ""}, {"glyph": "=", "name": "equals", "kind": "function", "monad": "classify", "dyad": "equal", "monad_rank": "∞", "dyad_ranks": "0 0", "hanzi": ["等", "等"], "shortcut": ""}, {"glyph": "≠", "name": "not-equals", "kind": "function", "monad": "unique-mask", "dyad": "not-equal", "monad_rank": "∞", "dyad_ranks": "0 0", "hanzi": ["别初", "別初"], "shortcut": " +"}, {"glyph": "<", "name": "less-than", "kind": "function", "monad": "sort-up", "dyad": "less", "monad_rank": "∞", "dyad_ranks": "0 0", "hanzi": ["小", "小"], "shortcut": ""}, {"glyph": "≤", "name": "less-than-or-equal", "kind": "function", "monad": "decrement", "dyad": "less-equal", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["限退", "限退"], "shortcut": " <"}, {"glyph": ">", "name": "greater-than", "kind": "function", "monad": "sort-down", "dyad": "greater", "monad_rank": "∞", "dyad_ranks": "0 0", "hanzi": ["大", "大"], "shortcut": ""}, {"glyph": "≥", "name": "greater-than-or-equal", "kind": "function", "monad": "increment", "dyad": "greater-equal", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["达进", "達進"], "shortcut": " >"}, {"glyph": "⍳", "name": "iota", "kind": "function", "monad": "indices", "dyad": "index-of", "monad_rank": "1", "dyad_ranks": "∞ ∞", "hanzi": ["位", "位"], "shortcut": " i"}, {"glyph": "↦", "name": "right-arrow-from-bar", "kind": "function", "monad": "range", "dyad": "to", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["至", "至"], "shortcut": " l"}, {"glyph": ":", "name": "colon", "kind": "function", "monad": "unkey", "dyad": "keyed", "monad_rank": "∞", "dyad_ranks": "1 ∞", "hanzi": ["键卸", "鍵卸"], "shortcut": ""}, {"glyph": "⍴", "name": "rho", "kind": "function", "monad": "shape", "dyad": "reshape", "monad_rank": "∞", "dyad_ranks": "1 ∞", "hanzi": ["形", "形"], "shortcut": " r"}, {"glyph": "≢", "name": "equal-underbar-slash", "kind": "function", "monad": "tally", "dyad": "not-match", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["数异", "數異"], "shortcut": " ?"}, {"glyph": "≡", "name": "equal-underbar", "kind": "function", "monad": "depth", "dyad": "match", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["同深", "同深"], "shortcut": " ="}, {"glyph": ",", "name": "comma", "kind": "function", "monad": "ravel", "dyad": "catenate", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["连", "連"], "shortcut": ""}, {"glyph": "⍪", "name": "comma-bar", "kind": "function", "monad": "table", "dyad": "catenate-first", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["接矩", "接矩"], "shortcut": " - ,"}, {"glyph": "⊂", "name": "left-shoe", "kind": "function", "monad": "enclose", "dyad": "partitioned-enclose", "monad_rank": "∞", "dyad_ranks": "1 ∞", "hanzi": ["包", "包"], "shortcut": " z"}, {"glyph": "⊃", "name": "right-shoe", "kind": "function", "monad": "mix", "dyad": "pick", "monad_rank": "0", "dyad_ranks": "1 ∞", "hanzi": ["选合", "選合"], "shortcut": " x"}, {"glyph": "⊆", "name": "left-shoe-underbar", "kind": "function", "monad": "nest", "dyad": "partition", "monad_rank": "∞", "dyad_ranks": "1 ∞", "hanzi": ["巢段", "巢段"], "shortcut": " - z"}, {"glyph": "∊", "name": "epsilon", "kind": "function", "monad": "enlist", "dyad": "member", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["属展", "屬展"], "shortcut": " e"}, {"glyph": "∪", "name": "down-shoe", "kind": "function", "monad": "unique", "dyad": "union", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["并独", "併獨"], "shortcut": " v"}, {"glyph": "∩", "name": "up-shoe", "kind": "function", "monad": "duplicates", "dyad": "intersection", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["交重", "交重"], "shortcut": " c"}, {"glyph": "⍋", "name": "delta-stile", "kind": "function", "monad": "grade-up", "dyad": "grade-up-by", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["升", "升"], "shortcut": " \\ 7"}, {"glyph": "⍒", "name": "del-stile", "kind": "function", "monad": "grade-down", "dyad": "grade-down-by", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["降", "降"], "shortcut": " \\ g"}, {"glyph": "↑", "name": "up-arrow", "kind": "function", "monad": "first", "dyad": "take", "monad_rank": "∞", "dyad_ranks": "1 ∞", "hanzi": ["取", "取"], "shortcut": " k"}, {"glyph": "↓", "name": "down-arrow", "kind": "function", "monad": "split", "dyad": "drop", "monad_rank": "1", "dyad_ranks": "1 ∞", "hanzi": ["去拆", "去拆"], "shortcut": " j"}, {"glyph": "⌽", "name": "circle-stile", "kind": "function", "monad": "reverse", "dyad": "rotate", "monad_rank": "1", "dyad_ranks": "0 1", "hanzi": ["转", "轉"], "shortcut": " 2"}, {"glyph": "⊖", "name": "circle-bar", "kind": "function", "monad": "reverse-first", "dyad": "rotate-first", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["纵", "縱"], "shortcut": " o -"}, {"glyph": "⍉", "name": "circle-backslash", "kind": "function", "monad": "transpose", "dyad": "reorder-axes", "monad_rank": "∞", "dyad_ranks": "1 ∞", "hanzi": ["翻", "翻"], "shortcut": " o \\"}, {"glyph": "⊤", "name": "down-tack", "kind": "function", "monad": "binary-encode", "dyad": "encode", "monad_rank": "∞", "dyad_ranks": "1 0", "hanzi": ["编", "編"], "shortcut": " n"}, {"glyph": "⊥", "name": "up-tack", "kind": "function", "monad": "binary-decode", "dyad": "decode", "monad_rank": "1", "dyad_ranks": "1 1", "hanzi": ["译", "譯"], "shortcut": " b"}, {"glyph": "⍎", "name": "hydrant", "kind": "function", "monad": "execute", "dyad": "execute-in", "monad_rank": "1", "dyad_ranks": "∞ ∞", "hanzi": ["行", "行"], "shortcut": " o b"}, {"glyph": "⍕", "name": "thorn", "kind": "function", "monad": "format", "dyad": "format-spec", "monad_rank": "∞", "dyad_ranks": "1 ∞", "hanzi": ["文", "文"], "shortcut": " o n"}, {"glyph": "⌷", "name": "squad", "kind": "function", "monad": "materialise", "dyad": "index", "monad_rank": "∞", "dyad_ranks": "1 ∞", "hanzi": ["索", "索"], "shortcut": " q \\"}, {"glyph": "⌹", "name": "domino", "kind": "function", "monad": "matrix-inverse", "dyad": "matrix-divide", "monad_rank": "2", "dyad_ranks": "∞ 2", "hanzi": ["解逆", "解逆"], "shortcut": " q u"}, {"glyph": "#", "name": "hash", "kind": "function", "monad": "runs", "dyad": "replicate", "monad_rank": "∞", "dyad_ranks": "1 ∞", "hanzi": ["复", "複"], "shortcut": ""}, {"glyph": "↕", "name": "up-down-arrow", "kind": "function", "monad": "pairs", "dyad": "windows", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["窗", "窗"], "shortcut": " K"}, {"glyph": "⍭", "name": "stile-tilde", "kind": "function", "monad": "prime", "dyad": "prime-mode", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["素", "素"], "shortcut": " \\"}, {"glyph": "⨸", "name": "circle-divide", "kind": "function", "monad": "factors", "dyad": "factor-spec", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["因", "因"], "shortcut": " o u"}, {"glyph": "⌻", "name": "quad-jot", "kind": "function", "monad": "roots", "dyad": "polyval", "monad_rank": "1", "dyad_ranks": "1 0", "hanzi": ["零值", "零值"], "shortcut": " q t"}, {"glyph": "⍸", "name": "iota-underbar", "kind": "function", "monad": "where", "dyad": "interval-index", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["处间", "處間"], "shortcut": " - i"}, {"glyph": "⍷", "name": "epsilon-underbar", "kind": "function", "monad": "groups", "dyad": "find", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["寻群", "尋群"], "shortcut": " - e"}, {"glyph": "⊢", "name": "right-tack", "kind": "function", "monad": "same", "dyad": "right", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["右", "右"], "shortcut": " '"}, {"glyph": "⊣", "name": "left-tack", "kind": "function", "monad": "same-left", "dyad": "left", "monad_rank": "∞", "dyad_ranks": "∞ ∞", "hanzi": ["左", "左"], "shortcut": " ;"}, {"glyph": "¿", "name": "inverted-question", "kind": "function", "monad": "roll", "dyad": "deal", "monad_rank": "0", "dyad_ranks": "0 0", "hanzi": ["掷抽", "擲抽"], "shortcut": " /"}, {"glyph": "¨", "name": "diaeresis", "kind": "monadic-operator", "monad": "each", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["遍", "遍"], "shortcut": " 1"}, {"glyph": "ᵇ", "name": "superscript-b", "kind": "monadic-operator", "monad": "bitwise", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["按", "按"], "shortcut": " 6 b"}, {"glyph": "⍨", "name": "tilde-diaeresis", "kind": "monadic-operator", "monad": "self", "dyad": "commute", "monad_rank": "", "dyad_ranks": "", "hanzi": ["己换", "己換"], "shortcut": " 1 `"}, {"glyph": "↣", "name": "right-tail-arrow", "kind": "dyadic-operator", "monad": "before", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["先", "先"], "shortcut": " ."}, {"glyph": "⍤", "name": "jot-diaeresis", "kind": "dyadic-operator", "monad": "rank", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["秩", "秩"], "shortcut": " 1 t"}, {"glyph": "∘", "name": "jot", "kind": "dyadic-operator", "monad": "atop", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["承", "承"], "shortcut": " t"}, {"glyph": "⍠", "name": "quad-colon", "kind": "dyadic-operator", "monad": "axis", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["轴", "軸"], "shortcut": " q ;"}, {"glyph": "⍥", "name": "circle-diaeresis", "kind": "dyadic-operator", "monad": "over", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["经", "經"], "shortcut": " 1 o"}, {"glyph": "↢", "name": "left-tail-arrow", "kind": "dyadic-operator", "monad": "after", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["后", "後"], "shortcut": " ,"}, {"glyph": ".", "name": "dot", "kind": "dyadic-operator", "monad": "determinant", "dyad": "inner-product", "monad_rank": "", "dyad_ranks": "", "hanzi": ["内", "內"], "shortcut": ""}, {"glyph": "⊗", "name": "circle-times", "kind": "monadic-operator", "monad": "outer-product", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["表", "表"], "shortcut": " o m"}, {"glyph": "⌸", "name": "quad-equal", "kind": "monadic-operator", "monad": "key", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["组", "組"], "shortcut": " q ="}, {"glyph": "⍣", "name": "star-diaeresis", "kind": "dyadic-operator", "monad": "power", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["次止", "次止"], "shortcut": " 1 8"}, {"glyph": "⇄", "name": "right-left-arrows", "kind": "monadic-operator", "monad": "optimize", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["优", "優"], "shortcut": " 4"}, {"glyph": "⊘", "name": "circle-slash", "kind": "dyadic-operator", "monad": "valences", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["兼", "兼"], "shortcut": " o /"}, {"glyph": "@", "name": "at", "kind": "dyadic-operator", "monad": "under", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["于", "於"], "shortcut": ""}, {"glyph": "∂", "name": "partial", "kind": "monadic-operator", "monad": "derivative", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["导梯", "導梯"], "shortcut": " f"}, {"glyph": "⍚", "name": "diamond-underbar", "kind": "dyadic-operator", "monad": "agenda", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["择", "擇"], "shortcut": " - `"}, {"glyph": "⌺", "name": "quad-diamond", "kind": "dyadic-operator", "monad": "stencil", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["邻", "鄰"], "shortcut": " q `"}, {"glyph": "/", "name": "slash", "kind": "monadic-operator", "monad": "reduce", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["总", "總"], "shortcut": ""}, {"glyph": "⌿", "name": "slash-bar", "kind": "monadic-operator", "monad": "reduce-first", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["汇", "匯"], "shortcut": " - /"}, {"glyph": "\\", "name": "backslash", "kind": "monadic-operator", "monad": "scan", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["累", "累"], "shortcut": ""}, {"glyph": "⍀", "name": "backslash-bar", "kind": "monadic-operator", "monad": "scan-first", "dyad": "", "monad_rank": "", "dyad_ranks": "", "hanzi": ["续", "續"], "shortcut": " - \\"}];