basedpl 0.1.45__tar.gz → 0.1.48__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 (444) hide show
  1. {basedpl-0.1.45 → basedpl-0.1.48}/.cargo/config.toml +4 -0
  2. {basedpl-0.1.45 → basedpl-0.1.48}/.github/workflows/ci.yml +3 -3
  3. {basedpl-0.1.45 → basedpl-0.1.48}/.gitignore +1 -0
  4. {basedpl-0.1.45 → basedpl-0.1.48}/Cargo.lock +48 -17
  5. {basedpl-0.1.45 → basedpl-0.1.48}/Cargo.toml +16 -5
  6. {basedpl-0.1.45 → basedpl-0.1.48}/DEV.md +26 -16
  7. {basedpl-0.1.45 → basedpl-0.1.48}/PKG-INFO +2 -2
  8. {basedpl-0.1.45/python/basedpl → basedpl-0.1.48/editors/jetbrains/BPL.tmbundle/Syntaxes}/bpl.tmLanguage.json +9 -9
  9. {basedpl-0.1.45 → basedpl-0.1.48}/editors/jetbrains/BPL.xml +5 -5
  10. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.keylayout +2 -2
  11. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.txt +1 -1
  12. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.keylayout +2 -2
  13. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.txt +1 -2
  14. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.keylayout +2 -2
  15. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.txt +1 -2
  16. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.keylayout +2 -2
  17. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.txt +1 -1
  18. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.keylayout +2 -2
  19. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.txt +1 -1
  20. basedpl-0.1.48/editors/vim/syntax/bpl.vim +32 -0
  21. {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/layout.h +2 -2
  22. {basedpl-0.1.45 → basedpl-0.1.48}/lib/array.bpl +2 -2
  23. {basedpl-0.1.45 → basedpl-0.1.48}/lib/dyalog.bpl +4 -4
  24. {basedpl-0.1.45 → basedpl-0.1.48}/lib/graph.bpl +2 -2
  25. {basedpl-0.1.45 → basedpl-0.1.48}/lib/numeric.bpl +1 -1
  26. {basedpl-0.1.45 → basedpl-0.1.48}/lib/tree.bpl +2 -2
  27. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/arrays.ipynb +4 -4
  28. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/assignment.ipynb +70 -3
  29. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/bpl.xml +9 -9
  30. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/comparison.qmd +1 -1
  31. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/data.ipynb +1 -1
  32. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/dfns.ipynb +1 -1
  33. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/distributions.ipynb +3 -3
  34. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/dyalog.ipynb +24 -96
  35. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/evaluation.qmd +3 -2
  36. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/phyllotaxis.bpl +1 -1
  37. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/getting-started.ipynb +2 -2
  38. basedpl-0.1.45/nbs/glyphs/under.qmd → basedpl-0.1.48/nbs/glyphs/at.qmd +3 -3
  39. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/backslash.qmd +1 -1
  40. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/brackets.qmd +1 -1
  41. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/bullet.qmd +1 -1
  42. basedpl-0.1.45/nbs/glyphs/transpose.qmd → basedpl-0.1.48/nbs/glyphs/circle-backslash.qmd +1 -1
  43. basedpl-0.1.45/nbs/glyphs/reverse-first.qmd → basedpl-0.1.48/nbs/glyphs/circle-bar.qmd +2 -2
  44. basedpl-0.1.45/nbs/glyphs/over.qmd → basedpl-0.1.48/nbs/glyphs/circle-diaeresis.qmd +1 -1
  45. basedpl-0.1.45/nbs/glyphs/factor.qmd → basedpl-0.1.48/nbs/glyphs/circle-divide.qmd +2 -2
  46. basedpl-0.1.45/nbs/glyphs/reverse.qmd → basedpl-0.1.48/nbs/glyphs/circle-stile.qmd +3 -3
  47. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/circle.qmd +7 -3
  48. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/colon.qmd +1 -1
  49. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/comma.qmd +1 -1
  50. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/del-diaeresis.qmd +1 -1
  51. basedpl-0.1.45/nbs/glyphs/grade-down.qmd → basedpl-0.1.48/nbs/glyphs/del-stile.qmd +3 -3
  52. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/del.qmd +1 -1
  53. basedpl-0.1.45/nbs/glyphs/grade-up.qmd → basedpl-0.1.48/nbs/glyphs/delta-stile.qmd +2 -2
  54. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/dot.qmd +3 -3
  55. basedpl-0.1.45/nbs/glyphs/drop.qmd → basedpl-0.1.48/nbs/glyphs/down-arrow.qmd +2 -2
  56. basedpl-0.1.45/nbs/glyphs/union.qmd → basedpl-0.1.48/nbs/glyphs/down-shoe.qmd +1 -1
  57. basedpl-0.1.45/nbs/glyphs/encode.qmd → basedpl-0.1.48/nbs/glyphs/down-tack.qmd +2 -2
  58. basedpl-0.1.45/nbs/glyphs/floor.qmd → basedpl-0.1.48/nbs/glyphs/downstile.qmd +1 -1
  59. basedpl-0.1.45/nbs/glyphs/find.qmd → basedpl-0.1.48/nbs/glyphs/epsilon-underbar.qmd +1 -1
  60. basedpl-0.1.45/nbs/glyphs/member.qmd → basedpl-0.1.48/nbs/glyphs/epsilon.qmd +1 -1
  61. basedpl-0.1.45/nbs/glyphs/tally.qmd → basedpl-0.1.48/nbs/glyphs/equal-underbar-slash.qmd +1 -1
  62. basedpl-0.1.45/nbs/glyphs/match.qmd → basedpl-0.1.48/nbs/glyphs/equal-underbar.qmd +1 -1
  63. basedpl-0.1.45/nbs/glyphs/equal.qmd → basedpl-0.1.48/nbs/glyphs/equals.qmd +2 -2
  64. basedpl-0.1.45/nbs/glyphs/greater-or-equal.qmd → basedpl-0.1.48/nbs/glyphs/greater-than-or-equal.qmd +1 -1
  65. basedpl-0.1.45/nbs/glyphs/greater.qmd → basedpl-0.1.48/nbs/glyphs/greater-than.qmd +1 -1
  66. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/hash.qmd +3 -3
  67. basedpl-0.1.45/nbs/glyphs/execute.qmd → basedpl-0.1.48/nbs/glyphs/hydrant.qmd +1 -1
  68. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/iota.qmd +3 -3
  69. basedpl-0.1.45/nbs/glyphs/rank.qmd → basedpl-0.1.48/nbs/glyphs/jot-diaeresis.qmd +3 -3
  70. basedpl-0.1.45/nbs/glyphs/atop.qmd → basedpl-0.1.48/nbs/glyphs/jot.qmd +1 -1
  71. basedpl-0.1.45/nbs/glyphs/assign.qmd → basedpl-0.1.48/nbs/glyphs/left-arrow.qmd +1 -1
  72. basedpl-0.1.45/nbs/glyphs/nest.qmd → basedpl-0.1.48/nbs/glyphs/left-shoe-underbar.qmd +1 -1
  73. basedpl-0.1.45/nbs/glyphs/enclose.qmd → basedpl-0.1.48/nbs/glyphs/left-shoe.qmd +2 -2
  74. basedpl-0.1.45/nbs/glyphs/left.qmd → basedpl-0.1.48/nbs/glyphs/left-tack.qmd +1 -1
  75. basedpl-0.1.45/nbs/glyphs/after.qmd → basedpl-0.1.48/nbs/glyphs/left-tail-arrow.qmd +2 -2
  76. basedpl-0.1.45/nbs/glyphs/less-or-equal.qmd → basedpl-0.1.48/nbs/glyphs/less-than-or-equal.qmd +1 -1
  77. basedpl-0.1.45/nbs/glyphs/less.qmd → basedpl-0.1.48/nbs/glyphs/less-than.qmd +1 -1
  78. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/overbar.qmd +2 -2
  79. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/parentheses.qmd +1 -1
  80. basedpl-0.1.45/nbs/glyphs/derivative.qmd → basedpl-0.1.48/nbs/glyphs/partial.qmd +11 -2
  81. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/pi.qmd +1 -1
  82. basedpl-0.1.45/nbs/glyphs/axis.qmd → basedpl-0.1.48/nbs/glyphs/quad-colon.qmd +2 -2
  83. basedpl-0.1.45/nbs/glyphs/stencil.qmd → basedpl-0.1.48/nbs/glyphs/quad-diamond.qmd +5 -5
  84. basedpl-0.1.45/nbs/glyphs/key.qmd → basedpl-0.1.48/nbs/glyphs/quad-equal.qmd +2 -2
  85. basedpl-0.1.45/nbs/glyphs/polynomial.qmd → basedpl-0.1.48/nbs/glyphs/quad-jot.qmd +3 -3
  86. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/quad.qmd +1 -1
  87. basedpl-0.1.45/nbs/glyphs/root.qmd → basedpl-0.1.48/nbs/glyphs/radical.qmd +1 -1
  88. basedpl-0.1.45/nbs/glyphs/range.qmd → basedpl-0.1.48/nbs/glyphs/right-arrow-from-bar.qmd +2 -2
  89. basedpl-0.1.48/nbs/glyphs/right-left-arrows.qmd +87 -0
  90. basedpl-0.1.45/nbs/glyphs/mix.qmd → basedpl-0.1.48/nbs/glyphs/right-shoe.qmd +1 -1
  91. basedpl-0.1.45/nbs/glyphs/right.qmd → basedpl-0.1.48/nbs/glyphs/right-tack.qmd +1 -1
  92. basedpl-0.1.45/nbs/glyphs/before.qmd → basedpl-0.1.48/nbs/glyphs/right-tail-arrow.qmd +1 -1
  93. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/slash.qmd +2 -2
  94. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/squad.qmd +1 -1
  95. basedpl-0.1.45/nbs/glyphs/power.qmd → basedpl-0.1.48/nbs/glyphs/star-diaeresis.qmd +2 -2
  96. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/star.qmd +1 -1
  97. basedpl-0.1.45/nbs/glyphs/prime.qmd → basedpl-0.1.48/nbs/glyphs/stile-tilde.qmd +2 -2
  98. basedpl-0.1.45/nbs/glyphs/format.qmd → basedpl-0.1.48/nbs/glyphs/thorn.qmd +1 -1
  99. basedpl-0.1.45/nbs/glyphs/commute.qmd → basedpl-0.1.48/nbs/glyphs/tilde-diaeresis.qmd +1 -1
  100. basedpl-0.1.45/nbs/glyphs/mul.qmd → basedpl-0.1.48/nbs/glyphs/times.qmd +1 -1
  101. basedpl-0.1.45/nbs/glyphs/windows.qmd → basedpl-0.1.48/nbs/glyphs/up-down-arrow.qmd +1 -1
  102. basedpl-0.1.45/nbs/glyphs/intersection.qmd → basedpl-0.1.48/nbs/glyphs/up-shoe.qmd +1 -1
  103. basedpl-0.1.45/nbs/glyphs/decode.qmd → basedpl-0.1.48/nbs/glyphs/up-tack.qmd +2 -2
  104. basedpl-0.1.45/nbs/glyphs/ceiling.qmd → basedpl-0.1.48/nbs/glyphs/upstile.qmd +1 -1
  105. basedpl-0.1.45/nbs/glyphs/nor.qmd → basedpl-0.1.48/nbs/glyphs/vee-bar.qmd +1 -1
  106. basedpl-0.1.45/nbs/glyphs/or.qmd → basedpl-0.1.48/nbs/glyphs/vee.qmd +1 -1
  107. basedpl-0.1.45/nbs/glyphs/nand.qmd → basedpl-0.1.48/nbs/glyphs/wedge-bar.qmd +1 -1
  108. basedpl-0.1.45/nbs/glyphs/and.qmd → basedpl-0.1.48/nbs/glyphs/wedge.qmd +1 -1
  109. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/zilde.qmd +1 -1
  110. basedpl-0.1.48/nbs/glyphs.qmd +154 -0
  111. basedpl-0.1.48/nbs/hanzi-notation-zh.ipynb +518 -0
  112. basedpl-0.1.48/nbs/hanzi-notation.ipynb +534 -0
  113. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/index.ipynb +3 -3
  114. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/keyboard.qmd +2 -2
  115. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/keyed.ipynb +1 -1
  116. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/llms.txt +10 -7
  117. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/magics.ipynb +48 -197
  118. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/notebooks.ipynb +27 -98
  119. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/numbers.qmd +2 -2
  120. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/principles.ipynb +1 -1
  121. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/python.ipynb +178 -482
  122. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/regex.ipynb +1 -1
  123. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/repl.qmd +3 -3
  124. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/scripts.ipynb +3 -3
  125. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/syntax.qmd +12 -5
  126. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/decompose.qmd +8 -1
  127. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/image.qmd +1 -1
  128. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/prefs.qmd +10 -3
  129. basedpl-0.1.48/nbs/web.ipynb +790 -0
  130. basedpl-0.1.48/nbs/xml.ipynb +928 -0
  131. basedpl-0.1.48/package-lock.json +615 -0
  132. basedpl-0.1.48/package.json +6 -0
  133. {basedpl-0.1.45 → basedpl-0.1.48}/py/Cargo.toml +5 -1
  134. {basedpl-0.1.45 → basedpl-0.1.48}/py/src/lib.rs +4 -0
  135. {basedpl-0.1.45 → basedpl-0.1.48}/pyproject.toml +5 -2
  136. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/__init__.py +3 -3
  137. {basedpl-0.1.45/editors/jetbrains/BPL.tmbundle/Syntaxes → basedpl-0.1.48/python/basedpl}/bpl.tmLanguage.json +9 -9
  138. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/bpltests.py +11 -4
  139. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/editors.py +18 -2
  140. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/functions.py +48 -15
  141. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/input.js +9 -7
  142. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/layout.json +1 -1
  143. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/lb.js +2 -2
  144. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/printing.py +25 -19
  145. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/worker.py +10 -6
  146. {basedpl-0.1.45 → basedpl-0.1.48}/src/array/storage.rs +27 -157
  147. {basedpl-0.1.45 → basedpl-0.1.48}/src/array/text.rs +9 -9
  148. {basedpl-0.1.45 → basedpl-0.1.48}/src/array.rs +122 -50
  149. {basedpl-0.1.45 → basedpl-0.1.48}/src/data.rs +3 -3
  150. {basedpl-0.1.45 → basedpl-0.1.48}/src/display.rs +29 -14
  151. {basedpl-0.1.45 → basedpl-0.1.48}/src/distribution.rs +1 -1
  152. {basedpl-0.1.45 → basedpl-0.1.48}/src/element.rs +20 -16
  153. {basedpl-0.1.45 → basedpl-0.1.48}/src/eval/assign.rs +22 -3
  154. {basedpl-0.1.45 → basedpl-0.1.48}/src/eval/binder.rs +124 -66
  155. {basedpl-0.1.45 → basedpl-0.1.48}/src/eval/dissect.rs +18 -18
  156. {basedpl-0.1.45 → basedpl-0.1.48}/src/eval/operators.rs +60 -13
  157. {basedpl-0.1.45 → basedpl-0.1.48}/src/eval/session.rs +24 -16
  158. {basedpl-0.1.45 → basedpl-0.1.48}/src/eval.rs +132 -62
  159. {basedpl-0.1.45 → basedpl-0.1.48}/src/execution.rs +7 -6
  160. {basedpl-0.1.45 → basedpl-0.1.48}/src/fusion.rs +59 -34
  161. basedpl-0.1.48/src/image/codecs.rs +67 -0
  162. basedpl-0.1.48/src/image/imageio.rs +266 -0
  163. basedpl-0.1.48/src/image.rs +171 -0
  164. {basedpl-0.1.45 → basedpl-0.1.48}/src/inspection.rs +5 -3
  165. {basedpl-0.1.45 → basedpl-0.1.48}/src/keyed.rs +1 -1
  166. {basedpl-0.1.45 → basedpl-0.1.48}/src/lib.rs +2 -1
  167. basedpl-0.1.48/src/minimize.rs +167 -0
  168. {basedpl-0.1.45 → basedpl-0.1.48}/src/number.rs +5 -13
  169. {basedpl-0.1.45 → basedpl-0.1.48}/src/number_theory.rs +7 -7
  170. {basedpl-0.1.45 → basedpl-0.1.48}/src/pervasive.rs +127 -86
  171. {basedpl-0.1.45 → basedpl-0.1.48}/src/plot.rs +1 -1
  172. {basedpl-0.1.45 → basedpl-0.1.48}/src/polynomial.rs +5 -5
  173. {basedpl-0.1.45 → basedpl-0.1.48}/src/primitive/indexing.rs +3 -3
  174. {basedpl-0.1.45 → basedpl-0.1.48}/src/primitive/numeric.rs +127 -30
  175. {basedpl-0.1.45 → basedpl-0.1.48}/src/primitive/search.rs +22 -18
  176. {basedpl-0.1.45 → basedpl-0.1.48}/src/primitive/structural.rs +12 -14
  177. {basedpl-0.1.45 → basedpl-0.1.48}/src/primitive.rs +107 -104
  178. {basedpl-0.1.45 → basedpl-0.1.48}/src/search.rs +19 -5
  179. {basedpl-0.1.45 → basedpl-0.1.48}/src/selection.rs +1 -1
  180. {basedpl-0.1.45 → basedpl-0.1.48}/src/symbols.rs +158 -29
  181. {basedpl-0.1.45 → basedpl-0.1.48}/src/syntax.rs +53 -31
  182. {basedpl-0.1.45 → basedpl-0.1.48}/src/system.rs +4 -2
  183. {basedpl-0.1.45 → basedpl-0.1.48}/tests/core.rs +90 -3
  184. {basedpl-0.1.45 → basedpl-0.1.48}/tests/highlighting.mjs +9 -6
  185. {basedpl-0.1.45 → basedpl-0.1.48}/tests/input.mjs +9 -1
  186. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/aplcart.bpl +33 -33
  187. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/april.bpl +3 -3
  188. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/bqn.bpl +12 -12
  189. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/core.bpl +134 -25
  190. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/ngn.bpl +3 -3
  191. {basedpl-0.1.45 → basedpl-0.1.48}/tests/scaling.rs +4 -2
  192. {basedpl-0.1.45 → basedpl-0.1.48}/tests/speed.txt +178 -167
  193. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_api.py +79 -63
  194. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_glyphs.py +5 -2
  195. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_ipython.py +2 -2
  196. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_kernel.py +11 -8
  197. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_repl.py +6 -6
  198. basedpl-0.1.45/editors/vim/syntax/bpl.vim +0 -32
  199. basedpl-0.1.45/nbs/glyphs/inverse-pair.qmd +0 -21
  200. basedpl-0.1.45/nbs/glyphs.qmd +0 -153
  201. basedpl-0.1.45/nbs/web.ipynb +0 -790
  202. basedpl-0.1.45/nbs/xml.ipynb +0 -928
  203. basedpl-0.1.45/src/image.rs +0 -181
  204. {basedpl-0.1.45 → basedpl-0.1.48}/.gitattributes +0 -0
  205. {basedpl-0.1.45 → basedpl-0.1.48}/.github/workflows/docs.yml +0 -0
  206. {basedpl-0.1.45 → basedpl-0.1.48}/.github/workflows/speed.yml +0 -0
  207. {basedpl-0.1.45 → basedpl-0.1.48}/.github/workflows/test.yml +0 -0
  208. {basedpl-0.1.45 → basedpl-0.1.48}/CONTRIBUTING.md +0 -0
  209. {basedpl-0.1.45 → basedpl-0.1.48}/LICENSE +0 -0
  210. {basedpl-0.1.45 → basedpl-0.1.48}/README.md +0 -0
  211. {basedpl-0.1.45 → basedpl-0.1.48}/_config.yml +0 -0
  212. {basedpl-0.1.45 → basedpl-0.1.48}/_layouts/default.html +0 -0
  213. {basedpl-0.1.45 → basedpl-0.1.48}/build.rs +0 -0
  214. {basedpl-0.1.45 → basedpl-0.1.48}/editors/jetbrains/BPL.tmbundle/info.plist +0 -0
  215. {basedpl-0.1.45 → basedpl-0.1.48}/editors/jetbrains/README.md +0 -0
  216. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.bundle/Contents/Info.plist +0 -0
  217. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.icns +0 -0
  218. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  219. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.bundle/Contents/version.plist +0 -0
  220. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.bundle/Contents/Info.plist +0 -0
  221. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.icns +0 -0
  222. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  223. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.bundle/Contents/version.plist +0 -0
  224. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.bundle/Contents/Info.plist +0 -0
  225. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.icns +0 -0
  226. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  227. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.bundle/Contents/version.plist +0 -0
  228. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.bundle/Contents/Info.plist +0 -0
  229. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.icns +0 -0
  230. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  231. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.bundle/Contents/version.plist +0 -0
  232. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.bundle/Contents/Info.plist +0 -0
  233. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.icns +0 -0
  234. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  235. {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.bundle/Contents/version.plist +0 -0
  236. {basedpl-0.1.45 → basedpl-0.1.48}/editors/vim/ftdetect/bpl.vim +0 -0
  237. {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/README.md +0 -0
  238. {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/build.ps1 +0 -0
  239. {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/install.ps1 +0 -0
  240. {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/keyboard.c +0 -0
  241. {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/keyboard.def +0 -0
  242. {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/keyboard.rc +0 -0
  243. {basedpl-0.1.45 → basedpl-0.1.48}/index_files/figure-commonmark/cell-17-output-1.svg +0 -0
  244. {basedpl-0.1.45 → basedpl-0.1.48}/index_files/figure-commonmark/cell-18-output-1.svg +0 -0
  245. {basedpl-0.1.45 → basedpl-0.1.48}/index_files/figure-html/cell-17-output-1.svg +0 -0
  246. {basedpl-0.1.45 → basedpl-0.1.48}/index_files/figure-html/cell-18-output-1.svg +0 -0
  247. {basedpl-0.1.45 → basedpl-0.1.48}/lib/LICENSE-april +0 -0
  248. {basedpl-0.1.45 → basedpl-0.1.48}/lib/README.md +0 -0
  249. {basedpl-0.1.45 → basedpl-0.1.48}/lib/power.bpl +0 -0
  250. {basedpl-0.1.45 → basedpl-0.1.48}/lib/regex.bpl +0 -0
  251. {basedpl-0.1.45 → basedpl-0.1.48}/lib/string.bpl +0 -0
  252. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/.gitignore +0 -0
  253. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/_quarto.yml +0 -0
  254. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/bqn.xml +0 -0
  255. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/bracket-types.ipynb +0 -0
  256. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/cli.qmd +0 -0
  257. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/driver.js +0 -0
  258. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/dyalog.xml +0 -0
  259. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/fonts/LICENSE-SAX2 +0 -0
  260. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/fonts/README.md +0 -0
  261. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/fonts/SAX2B.ttf +0 -0
  262. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/fonts/SAX2B.woff2 +0 -0
  263. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/fonts.css +0 -0
  264. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/attractor.bpl +0 -0
  265. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/boids.bpl +0 -0
  266. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/dragon.bpl +0 -0
  267. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/flow.bpl +0 -0
  268. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/mandelbrot.bpl +0 -0
  269. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/mandelbrot32.bpl +0 -0
  270. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/orbits.bpl +0 -0
  271. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/prefs.bpl +0 -0
  272. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/reaction.bpl +0 -0
  273. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery.qmd +0 -0
  274. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/_metadata.yml +0 -0
  275. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/alpha-underbar.qmd +0 -0
  276. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/alpha.qmd +0 -0
  277. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/backslash-bar.qmd +0 -0
  278. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/braces.qmd +0 -0
  279. /basedpl-0.1.45/nbs/glyphs/valences.qmd → /basedpl-0.1.48/nbs/glyphs/circle-slash.qmd +0 -0
  280. /basedpl-0.1.45/nbs/glyphs/log.qmd → /basedpl-0.1.48/nbs/glyphs/circle-star.qmd +0 -0
  281. /basedpl-0.1.45/nbs/glyphs/outer-product.qmd → /basedpl-0.1.48/nbs/glyphs/circle-times.qmd +0 -0
  282. /basedpl-0.1.45/nbs/glyphs/table.qmd → /basedpl-0.1.48/nbs/glyphs/comma-bar.qmd +0 -0
  283. /basedpl-0.1.45/nbs/glyphs/each.qmd → /basedpl-0.1.48/nbs/glyphs/diaeresis.qmd +0 -0
  284. /basedpl-0.1.45/nbs/glyphs/agenda.qmd → /basedpl-0.1.48/nbs/glyphs/diamond-underbar.qmd +0 -0
  285. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/diamond.qmd +0 -0
  286. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/domino.qmd +0 -0
  287. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/error-guard.qmd +0 -0
  288. /basedpl-0.1.45/nbs/glyphs/factorial.qmd → /basedpl-0.1.48/nbs/glyphs/exclamation.qmd +0 -0
  289. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/infinity.qmd +0 -0
  290. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/inverted-question.qmd +0 -0
  291. /basedpl-0.1.45/nbs/glyphs/where.qmd → /basedpl-0.1.48/nbs/glyphs/iota-underbar.qmd +0 -0
  292. /basedpl-0.1.45/nbs/glyphs/comment.qmd → /basedpl-0.1.48/nbs/glyphs/lamp.qmd +0 -0
  293. /basedpl-0.1.45/nbs/glyphs/dash.qmd → /basedpl-0.1.48/nbs/glyphs/minus.qmd +0 -0
  294. /basedpl-0.1.45/nbs/glyphs/not-equal.qmd → /basedpl-0.1.48/nbs/glyphs/not-equals.qmd +0 -0
  295. /basedpl-0.1.45/nbs/glyphs/div.qmd → /basedpl-0.1.48/nbs/glyphs/obelus.qmd +0 -0
  296. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/omega-underbar.qmd +0 -0
  297. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/omega.qmd +0 -0
  298. /basedpl-0.1.45/nbs/glyphs/add.qmd → /basedpl-0.1.48/nbs/glyphs/plus.qmd +0 -0
  299. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/question.qmd +0 -0
  300. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/quote.qmd +0 -0
  301. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/rho.qmd +0 -0
  302. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/slash-bar.qmd +0 -0
  303. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/stile.qmd +0 -0
  304. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/tilde.qmd +0 -0
  305. /basedpl-0.1.45/nbs/glyphs/take.qmd → /basedpl-0.1.48/nbs/glyphs/up-arrow.qmd +0 -0
  306. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/introspection.ipynb +0 -0
  307. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/modules.qmd +0 -0
  308. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/nbdev.yml +0 -0
  309. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/overview.ipynb +0 -0
  310. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/papers/aplwiki-arrays.md +0 -0
  311. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/papers/brickman-depth-1-scalars.md +0 -0
  312. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/papers/mercer-based-system.md +0 -0
  313. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground/bpl.js +0 -0
  314. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground/gallery.js +0 -0
  315. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground/monaco-worker.js +0 -0
  316. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground/page.js +0 -0
  317. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground/worker.js +0 -0
  318. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground.qmd +0 -0
  319. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/plot.ipynb +0 -0
  320. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/processes.qmd +0 -0
  321. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/puppy.jpg +0 -0
  322. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/sidebar.yml +0 -0
  323. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/strings.ipynb +0 -0
  324. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/styles.css +0 -0
  325. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/_metadata.yml +0 -0
  326. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/c.qmd +0 -0
  327. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/canvas.qmd +0 -0
  328. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/constants.qmd +0 -0
  329. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/copy.qmd +0 -0
  330. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/csv.qmd +0 -0
  331. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/date.qmd +0 -0
  332. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/deflate.qmd +0 -0
  333. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/delay.qmd +0 -0
  334. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/distribution.qmd +0 -0
  335. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/element.qmd +0 -0
  336. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/ex.qmd +0 -0
  337. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/fetch.qmd +0 -0
  338. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/float.qmd +0 -0
  339. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/hash.qmd +0 -0
  340. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/host.qmd +0 -0
  341. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/js.qmd +0 -0
  342. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/json.qmd +0 -0
  343. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/literal.qmd +0 -0
  344. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/load.qmd +0 -0
  345. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/metadata.qmd +0 -0
  346. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/mime.qmd +0 -0
  347. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/mkdir.qmd +0 -0
  348. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/nc.qmd +0 -0
  349. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/nget.qmd +0 -0
  350. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/nl.qmd +0 -0
  351. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/normalize.qmd +0 -0
  352. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/nput.qmd +0 -0
  353. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/path.qmd +0 -0
  354. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/plot.qmd +0 -0
  355. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/r.qmd +0 -0
  356. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/rand.qmd +0 -0
  357. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/readdir.qmd +0 -0
  358. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/remove.qmd +0 -0
  359. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/rename.qmd +0 -0
  360. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/signal.qmd +0 -0
  361. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/src.qmd +0 -0
  362. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/storage.qmd +0 -0
  363. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/svg.qmd +0 -0
  364. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/time.qmd +0 -0
  365. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/ucs.qmd +0 -0
  366. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/uuid.qmd +0 -0
  367. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/vfi.qmd +0 -0
  368. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/xml.qmd +0 -0
  369. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system-functions.qmd +0 -0
  370. {basedpl-0.1.45 → basedpl-0.1.48}/nbs/terms.qmd +0 -0
  371. {basedpl-0.1.45 → basedpl-0.1.48}/provenance/README.md +0 -0
  372. {basedpl-0.1.45 → basedpl-0.1.48}/provenance/aplcart.jsonl +0 -0
  373. {basedpl-0.1.45 → basedpl-0.1.48}/provenance/april.jsonl +0 -0
  374. {basedpl-0.1.45 → basedpl-0.1.48}/provenance/bqn.jsonl +0 -0
  375. {basedpl-0.1.45 → basedpl-0.1.48}/provenance/core.jsonl +0 -0
  376. {basedpl-0.1.45 → basedpl-0.1.48}/provenance/dyalog.jsonl +0 -0
  377. {basedpl-0.1.45 → basedpl-0.1.48}/provenance/ngn.jsonl +0 -0
  378. {basedpl-0.1.45 → basedpl-0.1.48}/py/build.rs +0 -0
  379. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/_modidx.py +0 -0
  380. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/dyalog.py +0 -0
  381. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/font.py +0 -0
  382. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/fonts.css +0 -0
  383. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/ipython.py +0 -0
  384. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/keyboards.json +0 -0
  385. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/keyboards.py +0 -0
  386. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/notebook_runner.py +0 -0
  387. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/notebooks.py +0 -0
  388. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/reference.py +0 -0
  389. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/syntax.py +0 -0
  390. {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/windows_keyboard.py +0 -0
  391. {basedpl-0.1.45 → basedpl-0.1.48}/rustfmt.toml +0 -0
  392. {basedpl-0.1.45 → basedpl-0.1.48}/scripts/install-macos.sh +0 -0
  393. {basedpl-0.1.45 → basedpl-0.1.48}/scripts/prep.py +0 -0
  394. {basedpl-0.1.45 → basedpl-0.1.48}/src/agreement.rs +0 -0
  395. {basedpl-0.1.45 → basedpl-0.1.48}/src/canvas.js +0 -0
  396. {basedpl-0.1.45 → basedpl-0.1.48}/src/canvas.rs +0 -0
  397. {basedpl-0.1.45 → basedpl-0.1.48}/src/csv.rs +0 -0
  398. {basedpl-0.1.45 → basedpl-0.1.48}/src/date.rs +0 -0
  399. {basedpl-0.1.45 → basedpl-0.1.48}/src/error.rs +0 -0
  400. {basedpl-0.1.45 → basedpl-0.1.48}/src/files.rs +0 -0
  401. {basedpl-0.1.45 → basedpl-0.1.48}/src/host.rs +0 -0
  402. {basedpl-0.1.45 → basedpl-0.1.48}/src/host_web.rs +0 -0
  403. {basedpl-0.1.45 → basedpl-0.1.48}/src/js.rs +0 -0
  404. {basedpl-0.1.45 → basedpl-0.1.48}/src/json.rs +0 -0
  405. {basedpl-0.1.45 → basedpl-0.1.48}/src/protocol.rs +0 -0
  406. {basedpl-0.1.45 → basedpl-0.1.48}/src/reference.rs +0 -0
  407. {basedpl-0.1.45 → basedpl-0.1.48}/src/regex.rs +0 -0
  408. {basedpl-0.1.45 → basedpl-0.1.48}/src/timing.rs +0 -0
  409. {basedpl-0.1.45 → basedpl-0.1.48}/src/xml.rs +0 -0
  410. {basedpl-0.1.45 → basedpl-0.1.48}/tests/conftest.py +0 -0
  411. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-aplcart +0 -0
  412. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-april +0 -0
  413. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-bqn +0 -0
  414. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-bqncrate +0 -0
  415. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-dyalog +0 -0
  416. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-ngn +0 -0
  417. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/README.md +0 -0
  418. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/distributions.bpl +0 -0
  419. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/dyalog.bpl +0 -0
  420. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/graphics.bpl +0 -0
  421. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/lib.bpl +0 -0
  422. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/regex.bpl +0 -0
  423. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/support/april.bpl +0 -0
  424. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/support/avl.bpl +0 -0
  425. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/support/redblack.bpl +0 -0
  426. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/support/sbst.bpl +0 -0
  427. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/support/splay.bpl +0 -0
  428. {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference.rs +0 -0
  429. {basedpl-0.1.45 → basedpl-0.1.48}/tests/speed.rs +0 -0
  430. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_basic.py +0 -0
  431. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_bpltests.py +0 -0
  432. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_graphics.py +0 -0
  433. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_keylayout.py +0 -0
  434. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_notebooks.py +0 -0
  435. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_reference.py +0 -0
  436. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_windows_keyboard.py +0 -0
  437. {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_worker.py +0 -0
  438. {basedpl-0.1.45 → basedpl-0.1.48}/tests/timing-lock.mjs +0 -0
  439. {basedpl-0.1.45 → basedpl-0.1.48}/tests/units.rs +0 -0
  440. {basedpl-0.1.45 → basedpl-0.1.48}/tests/wasm-pkg.mjs +0 -0
  441. {basedpl-0.1.45 → basedpl-0.1.48}/tests/wasm-speed.mjs +0 -0
  442. {basedpl-0.1.45 → basedpl-0.1.48}/tests/wasm.mjs +0 -0
  443. {basedpl-0.1.45 → basedpl-0.1.48}/tests/windows_keyboard.c +0 -0
  444. {basedpl-0.1.45 → basedpl-0.1.48}/wheel/data/share/jupyter/kernels/bpl/kernel.json +0 -0
@@ -3,6 +3,10 @@
3
3
  [build]
4
4
  rustflags = ["-C", "passes=slp-vectorizer"]
5
5
 
6
+ # rustymath uses Accelerate's per-thread BLAS controls on macOS.
7
+ [env]
8
+ MACOSX_DEPLOYMENT_TARGET = "15.0"
9
+
6
10
  # x86-64 builds need a CPU with AVX2 (x86-64-v3). The kernels rely on its rounding and wider vector instructions.
7
11
  [target.'cfg(target_arch = "x86_64")']
8
12
  rustflags = ["-C", "target-cpu=x86-64-v3", "-C", "passes=slp-vectorizer"]
@@ -27,13 +27,13 @@ jobs:
27
27
  with:
28
28
  python-version: '3.12'
29
29
  - if: runner.os != 'Linux'
30
- run: pip install 'fastws-cli>=0.0.22' && ${{ env.STAGE_BPL }}
30
+ run: pip install 'fastws-cli>=0.0.25' && ${{ env.STAGE_BPL }}
31
31
  - uses: PyO3/maturin-action@v1
32
32
  with:
33
- args: --profile dist --out dist -i python3.10 -i python3.11 -i python3.12 -i python3.13
33
+ args: --profile dist --no-default-features --out dist -i python3.10 -i python3.11 -i python3.12 -i python3.13
34
34
  manylinux: auto
35
35
  # This runs inside the manylinux container, whose old glibc lets the binary run on older Linux distributions.
36
- before-script-linux: export PATH="/opt/python/cp310-cp310/bin:$PATH" && python3.10 -m pip install 'fastws-cli>=0.0.22' && ${{ env.STAGE_BPL }}
36
+ before-script-linux: export PATH="/opt/python/cp310-cp310/bin:$PATH" && python3.10 -m pip install 'fastws-cli>=0.0.25' && ${{ env.STAGE_BPL }}
37
37
  - uses: actions/upload-artifact@v7
38
38
  with:
39
39
  name: wheels-${{ matrix.os }}
@@ -14,6 +14,7 @@ dist/
14
14
  build/
15
15
  .venv/
16
16
  venv/
17
+ node_modules/
17
18
  .env
18
19
  .DS_Store
19
20
  .ipynb_checkpoints/
@@ -93,7 +93,7 @@ checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5"
93
93
 
94
94
  [[package]]
95
95
  name = "basedpl"
96
- version = "0.1.45"
96
+ version = "0.1.48"
97
97
  dependencies = [
98
98
  "base64 0.23.1",
99
99
  "bytemuck",
@@ -129,6 +129,7 @@ dependencies = [
129
129
  "stacker",
130
130
  "strength_reduce",
131
131
  "tempfile",
132
+ "unicode-script",
132
133
  "unicode-width",
133
134
  "uuid",
134
135
  "walkdir",
@@ -139,7 +140,7 @@ dependencies = [
139
140
 
140
141
  [[package]]
141
142
  name = "basedpl-cli"
142
- version = "0.1.45"
143
+ version = "0.1.48"
143
144
  dependencies = [
144
145
  "async-trait",
145
146
  "basedpl",
@@ -153,7 +154,7 @@ dependencies = [
153
154
 
154
155
  [[package]]
155
156
  name = "basedpl-py"
156
- version = "0.1.45"
157
+ version = "0.1.48"
157
158
  dependencies = [
158
159
  "basedpl",
159
160
  "bytemuck",
@@ -168,7 +169,7 @@ dependencies = [
168
169
 
169
170
  [[package]]
170
171
  name = "basedpl-wasm"
171
- version = "0.1.45"
172
+ version = "0.1.48"
172
173
  dependencies = [
173
174
  "basedpl",
174
175
  "js-sys",
@@ -493,9 +494,9 @@ checksum = "869b0adbda23651a9c5c0c3d270aac9fcb52e8622a8f2b17e57802d7791962f2"
493
494
 
494
495
  [[package]]
495
496
  name = "equivalent"
496
- version = "1.0.2"
497
+ version = "1.0.3"
497
498
  source = "registry+https://github.com/rust-lang/crates.io-index"
498
- checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
499
+ checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826"
499
500
 
500
501
  [[package]]
501
502
  name = "errno"
@@ -547,6 +548,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
547
548
  checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb"
548
549
  dependencies = [
549
550
  "crc32fast",
551
+ "libz-sys",
550
552
  "miniz_oxide 0.9.1",
551
553
  "zlib-rs",
552
554
  ]
@@ -859,9 +861,9 @@ dependencies = [
859
861
 
860
862
  [[package]]
861
863
  name = "json5"
862
- version = "1.3.1"
864
+ version = "1.3.2"
863
865
  source = "registry+https://github.com/rust-lang/crates.io-index"
864
- checksum = "733a844dbd6fef128e98cb4487b887cb55454d92cd9994b1bafe004fabbe670c"
866
+ checksum = "c77a3f1d413a994290ebe4f96047763a84d04a1f31492c51328402986d7fe5fa"
865
867
  dependencies = [
866
868
  "serde",
867
869
  "ucd-trie",
@@ -910,6 +912,17 @@ version = "0.2.16"
910
912
  source = "registry+https://github.com/rust-lang/crates.io-index"
911
913
  checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
912
914
 
915
+ [[package]]
916
+ name = "libz-sys"
917
+ version = "1.1.30"
918
+ source = "registry+https://github.com/rust-lang/crates.io-index"
919
+ checksum = "f710a23e6dbf193214fd46ca56a9d6864e550abe86202184532ae7275e46de19"
920
+ dependencies = [
921
+ "cc",
922
+ "pkg-config",
923
+ "vcpkg",
924
+ ]
925
+
913
926
  [[package]]
914
927
  name = "linux-raw-sys"
915
928
  version = "0.12.1"
@@ -1110,6 +1123,12 @@ version = "0.2.17"
1110
1123
  source = "registry+https://github.com/rust-lang/crates.io-index"
1111
1124
  checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
1112
1125
 
1126
+ [[package]]
1127
+ name = "pkg-config"
1128
+ version = "0.3.34"
1129
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1130
+ checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548"
1131
+
1113
1132
  [[package]]
1114
1133
  name = "plotters"
1115
1134
  version = "0.3.7"
@@ -1398,9 +1417,9 @@ dependencies = [
1398
1417
 
1399
1418
  [[package]]
1400
1419
  name = "rustymath"
1401
- version = "0.1.14"
1420
+ version = "0.1.18"
1402
1421
  source = "registry+https://github.com/rust-lang/crates.io-index"
1403
- checksum = "9c4b9032437f945f3db8fa14a4382bec40d21cb4edf1adb8711af6c43b1bb4c5"
1422
+ checksum = "a56363f0b8b7fe94b0035c30839b56349b48c8d1576b0265072ff96914c6241b"
1404
1423
  dependencies = [
1405
1424
  "half",
1406
1425
  "hashbrown 0.17.1",
@@ -1672,9 +1691,9 @@ dependencies = [
1672
1691
 
1673
1692
  [[package]]
1674
1693
  name = "tokio"
1675
- version = "1.53.2"
1694
+ version = "1.53.3"
1676
1695
  source = "registry+https://github.com/rust-lang/crates.io-index"
1677
- checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044"
1696
+ checksum = "ce3335fa71841cda333a58d7615b03901380ecf09d59b3296d21f8bbac0dde4e"
1678
1697
  dependencies = [
1679
1698
  "bytes",
1680
1699
  "libc",
@@ -1754,6 +1773,12 @@ version = "1.0.27"
1754
1773
  source = "registry+https://github.com/rust-lang/crates.io-index"
1755
1774
  checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563"
1756
1775
 
1776
+ [[package]]
1777
+ name = "unicode-script"
1778
+ version = "0.5.8"
1779
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1780
+ checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee"
1781
+
1757
1782
  [[package]]
1758
1783
  name = "unicode-segmentation"
1759
1784
  version = "1.13.3"
@@ -1798,6 +1823,12 @@ dependencies = [
1798
1823
  "wasm-bindgen",
1799
1824
  ]
1800
1825
 
1826
+ [[package]]
1827
+ name = "vcpkg"
1828
+ version = "0.2.15"
1829
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1830
+ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
1831
+
1801
1832
  [[package]]
1802
1833
  name = "version_check"
1803
1834
  version = "0.9.5"
@@ -2052,7 +2083,7 @@ checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
2052
2083
 
2053
2084
  [[package]]
2054
2085
  name = "xtask"
2055
- version = "0.1.45"
2086
+ version = "0.1.48"
2056
2087
  dependencies = [
2057
2088
  "anyhow",
2058
2089
  "serde_json",
@@ -2085,18 +2116,18 @@ dependencies = [
2085
2116
 
2086
2117
  [[package]]
2087
2118
  name = "zerocopy"
2088
- version = "0.8.62"
2119
+ version = "0.8.63"
2089
2120
  source = "registry+https://github.com/rust-lang/crates.io-index"
2090
- checksum = "86502bf56ac7c77571a32e2647bb2a15894565e981fb2a48d7bde2d91c965a9d"
2121
+ checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8"
2091
2122
  dependencies = [
2092
2123
  "zerocopy-derive",
2093
2124
  ]
2094
2125
 
2095
2126
  [[package]]
2096
2127
  name = "zerocopy-derive"
2097
- version = "0.8.62"
2128
+ version = "0.8.63"
2098
2129
  source = "registry+https://github.com/rust-lang/crates.io-index"
2099
- checksum = "5457206954b06561e2608c7e19cf58b1926586d999c246eebe4502f7e2039d1a"
2130
+ checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f"
2100
2131
  dependencies = [
2101
2132
  "proc-macro2",
2102
2133
  "quote",
@@ -2,7 +2,7 @@
2
2
  members = ["py"]
3
3
 
4
4
  [workspace.package]
5
- version = "0.1.45"
5
+ version = "0.1.48"
6
6
  edition = "2021"
7
7
  rust-version = "1.98"
8
8
  license = "Apache-2.0"
@@ -40,29 +40,32 @@ incremental = false
40
40
  lto = false
41
41
  strip = true
42
42
 
43
+ [features]
44
+ default = ["native"]
45
+ # rustymath's own linear algebra, beside Accelerate on macOS, for `RUSTYMATH_NATIVE=1`. The Mac release builds turn it off.
46
+ native = ["rustymath/native"]
47
+
43
48
  [dependencies]
44
49
  csv = "1"
45
50
  tempfile = "3"
46
51
  serde = ">=1.0.229, <2"
47
52
  serde_json = { version = "1", features = ["arbitrary_precision", "preserve_order"] }
48
53
  unicode-width = { version = ">=0.2.2, <1", default-features = false }
54
+ unicode-script = "0.5"
49
55
  num-rational = ">=0.4.2, <1"
50
56
  num-complex = { version = ">=0.4.6, <1", features = ["bytemuck"] }
51
57
  num-bigint = ">=0.4.6, <0.5"
52
58
  num-traits = ">=0.2.19, <1"
53
59
  half = { version = ">=2.7.1, <3", features = ["num-traits", "bytemuck"] }
54
- rustymath = ">=0.1.14, <1"
60
+ rustymath = { version = ">=0.1.18, <1", default-features = false }
55
61
  strength_reduce = ">=0.2.4, <1"
56
62
  rand = ">=0.10.2, <1"
57
63
  # AnswerDotAI's fork measures text with a canvas, which works in a Web Worker: plotters-rs/plotters#746.
58
64
  plotters = { git = "https://github.com/AnswerDotAI/plotters.git", branch = "master", default-features = false, features = ["svg_backend", "colormaps", "full_palette"] }
59
- image = { version = ">=0.25.6, <1", default-features = false, features = ["png", "jpeg"] }
60
- png = ">=0.18.1, <1"
61
65
  base64 = ">=0.22.1, <1"
62
66
  stacker = ">=0.1.25, <1"
63
67
  foldhash = ">=0.2.0, <1"
64
68
  bytemuck = { version = ">=1.25.2, <2", features = ["extern_crate_alloc"] }
65
- flate2 = ">=1.1.10, <2"
66
69
  json5 = ">=1.3.1, <2"
67
70
  roxmltree = { version = ">=0.21.1, <1", default-features = false, features = ["std"] }
68
71
  sha2 = ">=0.10.9, <1"
@@ -76,6 +79,14 @@ nix = { version = ">=0.31.3, <1", default-features = false, features = ["user"]
76
79
  [target.'cfg(target_vendor = "apple")'.dependencies]
77
80
  # The timing lock's QoS call, which keeps a timing on the performance cores.
78
81
  libc = ">=0.2.190, <1"
82
+ # The Mac build links the zlib that macOS ships, in place of compiling `miniz_oxide`.
83
+ flate2 = { version = ">=1.1.10, <2", default-features = false, features = ["zlib"] }
84
+
85
+ [target.'cfg(not(target_vendor = "apple"))'.dependencies]
86
+ flate2 = ">=1.1.10, <2"
87
+ # Macs decode and encode images through ImageIO instead.
88
+ image = { version = ">=0.25.6, <1", default-features = false, features = ["png", "jpeg"] }
89
+ png = ">=0.18.1, <1"
79
90
 
80
91
  [target.'cfg(not(all(target_arch = "wasm32", target_os = "unknown")))'.dependencies]
81
92
  chrono = { version = ">=0.4.45, <0.5", features = ["unstable-locales"] }
@@ -2,7 +2,7 @@
2
2
 
3
3
  Keep the language concise to write, simple to read and consistent to understand. A design rule is a plan on trial. Discuss it when applying it makes a useful expression harder to read, removes something expressible or requires another special case. APL familiarity and compatibility are not costs in that decision. Change callers with an API change instead of adding compatibility layers.
4
4
 
5
- Speed and simplicity come before edge cases no real user meets. Follow IEEE, Rust and CPU behaviour where it gives a reasonable result. Don't add precision, sign normalization or defensive passes without an agreed need.
5
+ Speed and simplicity come before edge cases no real user meets. Follow IEEE, Rust and CPU behaviour where it gives a reasonable result. The last bits of a result can differ between thread counts, platforms, builds and runs. Never spend speed, memory or code to make them agree. Don't add precision, sign normalization or defensive passes without an agreed need.
6
6
 
7
7
  ## You MUST read this ENTIRE section in FULL first
8
8
 
@@ -20,23 +20,27 @@ Build nothing else without discussion: no scratch crates, alternate target direc
20
20
 
21
21
  An already-running Python process retains its loaded extension. In a kernel, use `from basedpl.worker import fresh; fresh(code)` to check the installed `bpl` in a fresh worker instead of restarting the kernel. A BPL error raises `BplError`. Check one expression and read its result before building on it. `basedpl.bpltests.check_file` and `check_page` check reference files and documentation through the worker without building Rust.
22
22
 
23
- Measure with `BASEDPL_COSTS=1 cargo test --test speed -- --nocapture` or `basedpl.bpltests.time_cases(cases)`. Both use copies of the same data as the unit. Budgets are single-thread measurements. Use `time_cases(..., threads=...)` separately for scaling. `speed_costs()` reads the cases in `tests/speed.txt`; `cases=` selects expressions and `wasm=DIR` selects a browser build. `logged_costs(log)` reads CI output, and `cargo_costs(path)` runs either project's speed test. `set_budgets(native, wasm, run)` applies the rule in the budget file; `path=` selects rustymath's `tests/speed.txt`. The manual `Speed` workflow measures the native and wasm builds on CI.
23
+ Measure with `BASEDPL_COSTS=1 cargo test --test speed -- --nocapture` or `basedpl.bpltests.time_cases(cases)`. Both count costs in copies. A copy is the time to write as many floats as the data has items, each negated, into a second buffer. Budgets are single-thread measurements. Use `time_cases(..., threads=...)` separately for scaling. `speed_costs()` reads the cases in `tests/speed.txt`. `cases=` selects expressions, `wasm=DIR` selects a browser build, `bpl=PATH` selects another native `bpl`, and `native=True` times rustymath's own linear algebra, which dev builds compile in. `logged_costs(log)` reads CI output, and `cargo_costs(path)` runs either project's speed test.
24
24
 
25
- Cooperating tools share `/tmp/aai-ws-timing.lock`. Timings take it exclusively. `cargo develop`, `cargo wasm`, the reference test and pytest take it shared. Other Rust tests and bare Cargo commands do not all take it. After five minutes a timing fails; a build/test proceeds without the lock. Never hold it in the shared kernel process or coordinate timings manually. A timing launched there would block behind the hold and stall other agents' kernel calls. Native timings set rustymath's current-thread count to one and request user-interactive macOS QoS to favour performance cores. QoS is not CPU affinity.
25
+ The manual `Speed` workflow measures the native and wasm builds on CI. When you review a run, look mainly for costs that changed by more than 20%, especially where several similar operations changed by similar amounts. Never raise budgets mechanically from a run's costs, because mechanical rises can lock in poor performance. Study each slowdown until you know its cause. Raise a budget only for a slowdown you've judged reasonable, never for a minor variation. `set_budgets(native, wasm, cases=cases)` applies the rule in the budget file to the cases that `cases` names. Name only the cases whose budgets should change. Without `cases`, it changes every case with a cost. Pass `run=` only when the run sets every budget. It replaces the header line that names the run all the CI figures come from. `path=` selects rustymath's `tests/speed.txt`.
26
+
27
+ To compare a change with the build before it, copy the installed `bpl` before the change, then time both copies in turn with `speed_costs(bpl=path)` or `time_cases(..., bpl=path)`. Don't restore old code in the shared tree to get a baseline. On macOS, native timings of matrix products and decompositions mostly measure Accelerate. Rustymath's DEV.md says how to time rustymath's own kernels.
28
+
29
+ Cooperating tools share `/tmp/aai-ws-timing.lock`. Timings take it exclusively. `cargo develop`, `cargo wasm`, the reference test and pytest take it shared. Other Rust tests and bare Cargo commands do not all take it. After five minutes a timing fails; a build/test proceeds without the lock. After 30 seconds, an exclusive wait prints the processes with the lock file open. The list can include processes that are only waiting for the lock. Never hold it in the shared kernel process or coordinate timings manually. A timing launched there would block behind the hold and stall other agents' kernel calls. Native timings set rustymath's current-thread count to one and request user-interactive macOS QoS to favour performance cores. QoS is not CPU affinity.
26
30
 
27
31
  Run `cargo wasm` during development only for browser work. Agents use `cargo wasm --out DIR` and set `BASEDPL_WASM=DIR` when running `node --test tests/wasm.mjs` and `node --no-liftoff --test tests/wasm-speed.mjs`. This avoids replacing a module another agent is using. For other edits under `cfg(web)` or `host_web.rs`, check compilation with `cargo check -p basedpl --target wasm32-unknown-unknown`.
28
32
 
29
33
  ### X86-64 machine code
30
34
 
31
- To inspect x86 code on this Mac, run this in basedpl or rustymath:
35
+ To inspect the x86-64 code that CI and Linux run, build the library for Linux x86-64. In basedpl:
32
36
 
33
37
  ```bash
34
- cargo build --lib --release --target x86_64-apple-darwin --target-dir /tmp/aai-ws-x86
38
+ CC_x86_64_unknown_linux_gnu=clang cargo build --lib --release --target x86_64-unknown-linux-gnu --target-dir /tmp/aai-ws-x86 -p basedpl
35
39
  ```
36
40
 
37
- That target is installed here. Its x86-64 config flags match those used for CI's hot loops; the `test` profile inherits release's optimization settings. Run it only to answer an x86-code question. It does not take the timing lock and can disturb timings running alongside it.
41
+ In rustymath, use `-p rustymath`. The target is Linux because macOS builds leave out rustymath's native linear algebra kernels. That target is installed here. `-p` builds only the library, because the Python extension crates can't be built for Linux on this Mac. `CC_x86_64_unknown_linux_gnu=clang` lets Apple's `clang` assemble the x86-64 source in basedpl's `psm` dependency, because this Mac has no `x86_64-linux-gnu-gcc`. Don't move that setting into `.cargo/config.toml`. CI's Linux release builds also read that file, and their manylinux container has no `clang`. The build matches CI's `test` profile in its x86-64 flags and optimization settings. Run it only to answer an x86-code question. It doesn't take the timing lock and can disturb timings running alongside it.
38
42
 
39
- Read the newest `lib<crate>-<hash>.rlib` under `/tmp/aai-ws-x86/x86_64-apple-darwin/release/deps` with `objdump -d -r --no-show-raw-insn --disassemble-symbols=NAME`. `-r` identifies called functions. `objdump` warns for each archive object without that symbol. `-C` matches demangled names but splits them at commas; for a generic name containing a comma, get its mangled name from `nm` and omit `-C`. Generic code belongs to the crate that instantiates it. Don't use `--emit asm`: the resulting codegen-unit arrangement can inline differently from the build being inspected.
43
+ Read the newest `lib<crate>-<hash>.rlib` under `/tmp/aai-ws-x86/x86_64-unknown-linux-gnu/release/deps` with `objdump -d -r --no-show-raw-insn --disassemble-symbols=NAME`. `-r` identifies called functions. `objdump` warns for each archive object without that symbol. `-C` matches demangled names but splits them at commas; for a generic name containing a comma, get its mangled name from `nm` and omit `-C`. Generic code belongs to the crate that instantiates it. Don't use `--emit asm`: the resulting codegen-unit arrangement can inline differently from the build being inspected.
40
44
 
41
45
  ## Workspace, builds and CI
42
46
 
@@ -54,6 +58,8 @@ Rust 1.98 or later supplies algebraic float operations. `test` inherits `release
54
58
 
55
59
  `fastws`'s `cargo develop` builds profile `test`, installs the extension and stages `bpl` into the venv. `py/` enables PyO3's `extension-module` and supplies its link arguments without libpython. Editable installs use `fastws.build_backend`; they install metadata and a path to `python/` without compiling Rust. After a standalone `uv sync` or editable pip install, run `cargo develop`. `ws-sync` performs that rebuild after syncing. Wheels use maturin for the extension and `cargo stage` for the Python-free CLI. Linux staging runs inside the manylinux container.
56
60
 
61
+ Basedpl's crates pass on rustymath's default `native` feature, which rustymath's DEV.md describes. Each depends on the crate below it with `default-features = false` and makes `native` its own default. The release job builds wheels with `--no-default-features`. `cargo stage` always builds without default features. The released Mac builds therefore leave out rustymath's own linear algebra. On Apple targets, `flate2` uses the system zlib. Other targets keep its Rust backend, `miniz_oxide`.
62
+
57
63
  Use published dependency ranges with the lower bounds required by the APIs in use. `Cargo.toml` names a published rustymath range; the `~/aai-ws` Cargo patch selects the sibling checkout locally. CI resolves published crates. Release rustymath changes before relying on them in basedpl CI. Don't edit fastws-generated Cargo patches, `.git/fastws-cargo-key` or workspace configuration, and don't commit the workspace-generated `Cargo.lock`. `meta/` is ignored planning material, not contributor documentation. `[tool.uv] cache-keys` tracks packaging manifests, not Rust sources.
58
64
 
59
65
  `Test` runs native and wasm jobs on pushes to main and pull requests. Native CI runs `cargo test`, editable installation, `cargo develop`, pytest, `bpl-nb` and `nbdev-test`. Python tests use the same test-profile build. The wasm job builds with `cargo wasm --strip` and runs both Node suites. Both jobs use `ubicloud-standard-4`; speed budgets are set for that runner. They generate a lockfile before restoring `Swatinem/rust-cache`, making dependency changes part of the cache key. `Speed` is manually triggered and restores those caches.
@@ -66,7 +72,7 @@ LTO-off incremental builds keep an edit from recompiling every caller that inlin
66
72
 
67
73
  Generic loop instances can concentrate in the defining module's codegen unit. Mark loop helpers `#[inline]` when their instances need to compile with the caller's kernel table, including nested helpers. Kernel tables have separate modules: `booleans`, `wholes`, `float_arithmetic`, `float_kernels` and `complex_kernels`. `at_widths!` gives the concrete widths their own modules. Keep new tables separate and add kernel specializations only for measured gains.
68
74
 
69
- Use `cargo build --lib --bins --profile test --timings` to inspect the normal build. Its report under `target/cargo-timings/` separates frontend and codegen time. `BASEDPL_UNITS=1 cargo test --test units -- --nocapture` lists large units and their functions. `BASEDPL_SIZES=pattern cargo test --test units -- --nocapture` measures machine code matching a demangled-name regex. These commands diagnose the current compilation arrangement; don't create scratch builds to approximate it.
75
+ Use `cargo build --lib --bins --profile test --timings` to inspect the normal build. Its report under `target/cargo-timings/` separates frontend and codegen time. `BASEDPL_UNITS=1 cargo test --test units -- --nocapture` lists large units and their functions. `BASEDPL_SIZES=pattern cargo test --test units -- --nocapture` measures machine code matching a demangled-name regex. `BASEDPL_SIZES` sees only basedpl's own codegen units. `BASEDPL_SIZES_DIFF=old:new cargo test --test units machine_code_growth -- --nocapture` compares two binaries, such as copies of `bpl` from before and after a change, by generic function across every crate. These commands diagnose the current compilation arrangement; don't create scratch builds to approximate it.
70
76
 
71
77
  ## Code map
72
78
 
@@ -93,6 +99,8 @@ User-facing language rules belong in `nbs/syntax.qmd`, `evaluation.qmd`, `number
93
99
 
94
100
  The lexer/parser records byte spans and structural syntax without evaluating expressions. `parse_at` distinguishes complete input, incomplete input and errors at a given float width. Public `parse` uses f64; `Session::parse` uses the session width. `syntax_tree` supplies source tools with structural nodes and recovers invalid chunks as `Error` nodes. `highlight` shares the lexer.
95
101
 
102
+ `symbols.rs` owns APL, simplified and traditional Hanzi spellings. Its rows also hold each glyph's names: a glyph name for the character, which is also its page's file name in `nbs/glyphs/`, and a name for each valence, or one name where both valences do the same thing. The glyph reference, named entry, help and Python's exported names all read them there. Parsing always accepts them together, canonicalizing token decisions while retaining original source and spans. Han characters are reserved outside strings and comments. The `notation` preference affects structured function/operator display, not stored source, serialization or structural APIs; help and editor metadata use the same spelling table.
103
+
96
104
  The binder resolves runtime categories right to left. It owns unfinished strands, trains and bound arguments; shared function nodes are immutable. Grammatical reduction produces application requests instead of calling functions. Primitive/operator rows own names, operand kinds, ranks, pervasion, axis behaviour and reduction identities. Change those rows instead of duplicating metadata in consumers. A non-extending primitive above its natural ranks runs through Rank; pervasive Each/Outer/Rank paths reuse whole-array kernels.
97
105
 
98
106
  Dot names rewrite to Pick, and dot brackets/subscripts to selection. Dot parentheses evaluate a namespace: `T.(expr)` and `T⍎text` use the keyed entries of `T` as locals, resolve other names in the caller and keep assignments local. They share the scoped execution route and lexical lifetime checks. Between functions, dot remains inner product.
@@ -107,7 +115,7 @@ Tail calls reuse frames while preserving lexical dependencies. Handlers disable
107
115
 
108
116
  ## Values, layouts and assignment
109
117
 
110
- `Value` holds a number, character, function, operator or shared array. Compact storage holds Booleans, narrow integers, width-specific floats/complex numbers or characters. Mixed storage holds `Value`s and memoizes its prototype and innermost lexical dependency. Other properties are computed when needed. A layout and its shared `Arc<Storage>` can be copied separately; changing axes need not copy items. `Buffer`, `Value::buffer` and `from_buffer` are the public width-preserving frontend boundary.
118
+ `Value` holds a number, character, function, operator or shared array. Compact storage holds Booleans, narrow integers, width-specific floats/complex numbers or characters. Mixed storage holds `Value`s and memoizes its prototype and innermost lexical dependency. Other properties are computed when needed. An array holds its layout and its storage in one allocation. Its `Shape` holds ranks 0 to 2 inline, so a small array allocates no shape. Constructors take `impl Into<Shape>`: pass a slice, or an array such as `[n]`, rather than building a `Vec`. A shape, key or name change on a shared array makes a view of the base array's storage and copies no items. `Buffer`, `Value::buffer` and `from_buffer` are the public width-preserving frontend boundary.
111
119
 
112
120
  Atoms, rank-0 arrays and singleton vectors are distinct. Function nodes retain handles, not lexical frames or Python objects. Functions match by their parts; dfns and generators match by identity. Operators can be values and can cross the native Python boundary. Values and function nodes are `Send + Sync`.
113
121
 
@@ -115,7 +123,7 @@ Numeric storage fills with zero and characters with blank. Mixed nonempty arrays
115
123
 
116
124
  `Layout` owns dimensions, position keys, axis names and optional renderer metadata. Agreement unites keys and broadcasts through index maps. Missing positions read each source's prototype. Agreement pairs equal axis names first. It pairs remaining axes positionally unless both have different names. Result assembly drops colliding axis names; public name attachment rejects duplicates. Contracted axes require equal key sets and retain the first order. Nonempty key lists with no named positions become unkeyed; empty record keys survive.
117
125
 
118
- `Gather` owns copying and widening. `Steps` describes strides, ranges/fills, rotations and offset tables. Structural operations should use `remap`/gathering rather than reconstructing `Value`s per item. Equal-shape cells copy in blocks. `Items` reads counts, positions and axes from compact storage without boxing every item. Shape, tally, positions and predicates have dedicated integer/Boolean builders.
126
+ `Gather` owns copying and widening. `Steps`, from rustymath's `gather`, describes strides, ranges/fills, rotations and offset tables. `Gather::walk` copies compact storage through `rustymath::gather::walk`. Structural operations should use `remap`/gathering rather than reconstructing `Value`s per item. Equal-shape cells copy in blocks. `Items` reads counts, positions and axes from compact storage without boxing every item. Shape, tally, positions and predicates have dedicated integer/Boolean builders.
119
127
 
120
128
  Selective assignment and structural Under share label-based target discovery. Function-Under applies its selector to both arguments independently before calling its operand; labels then identify writeback into the right argument. Positions-Under passes the left argument whole. Keep those contracts distinct. Keyed values align to selected keys, and nested paths retain empty-cell structure.
121
129
 
@@ -125,7 +133,7 @@ Rank/Each/Outer assemble cells through shared layout/prototype rules. A 0-cell p
125
133
 
126
134
  Axis nodes select/move axes and reuse Rank when the function has no direct axis meaning. Vector-axis reduction uses the general composed-ravel rule, preserving axis order and the whole seed. Single-axis reductions retain direct kernels. Layout-only changes share storage. Structural results retain renderers where their rank permits; scans and in-place changes copy complete layouts. Match ignores renderers.
127
135
 
128
- Inverse nodes propagate fixed-argument sides through composition. Candidate-building primitive inverses validate by applying the primitive again. Inverse scans share forward scan's seed/axis validation. Agenda calls its selector once, then passes the original arguments to the selected branch. Computed operands for Rank, Axis, Stencil and Agenda use shared operand evaluation. Python constructs these nodes directly, not by generating source.
136
+ Inverse nodes propagate fixed-argument sides through composition. `f⁻¹←g` and `f∂←g` replace the binding with a `Ruled` node, which holds the function with its hand-written inverse and derivative. Calling it calls the function. `⁻¹` and `∂` use the rules, and Under counts an attached inverse as keeping every item. Candidate-building primitive inverses validate by applying the primitive again. Inverse scans share forward scan's seed/axis validation. Agenda calls its selector once, then passes the original arguments to the selected branch. Computed operands for Rank, Axis, Stencil and Agenda use shared operand evaluation. Python constructs these nodes directly, not by generating source.
129
137
 
130
138
  ## Numbers and backend ownership
131
139
 
@@ -141,11 +149,11 @@ Floats use IEEE NaN, infinity and signed zero. Comparison treats NaN as unequal;
141
149
 
142
150
  Only f64 comparisons use the session tolerance, from 0 to `1E-14`. f32/f16 compare exactly except fixed-point convergence, which uses four ulps; f64 convergence uses `1E-14` independently of the preference. Index/count/Boolean/character-offset conversion uses `near_integer` with the fixed default tolerance, not the comparison preference. The tolerant types and objects come from rustymath. Keep independent inside/outside-tolerance tests with exact/mixed controls; don't use language comparison as its own oracle.
143
151
 
144
- `search.rs` selects compact exact or tolerant backends. Exact integer/Boolean/character storage uses keys; float searches use their width. Integer haystacks accept the whole-number shortcut only for exactly whole float needles. Tolerant indexing validates whole-key matches unless the haystack is exactly whole and falls back to buckets on mismatch. Classification intentionally chains tolerance through sorted runs, so it need not match every member to one representative. Other cells use exact hashes or first-number buckets with `Value::matches` confirmation, falling back to pairwise comparison where indexing is unsuitable. Grade is stable. Position buffers use u32 and become integer storage without another pass.
152
+ `search.rs` selects compact exact or tolerant backends. Exact integer/Boolean/character storage uses keys; float searches use their width. Integer haystacks accept the whole-number shortcut only for exactly whole float needles. Tolerant indexing validates whole-key matches unless the haystack is exactly whole and falls back to buckets on mismatch. Classification intentionally chains tolerance through sorted runs, so it need not match every member to one representative. Other cells use exact hashes or first-number buckets with `Value::matches` confirmation, falling back to pairwise comparison where indexing is unsuitable. Grade is stable. Position buffers use u32 and become integer storage without another pass. `⍷` and monadic Key take each class's positions from `search::class_positions`, which keeps a class's own buffer for 32-bit positions and copies narrower ones once from the shared buffer. Dyadic Key selects rows through `Grouped::each` slices. Key with the operand `≢⊢`, which `≢∘⊢` also builds, counts its classes through `search::class_counts` and builds no positions.
145
153
 
146
154
  `Domain` and `with_field!` select working reals, Complex64 or BigRational for generic numeric algorithms. Compact storage selects the domain without scanning its items. `number::read` converts once; `Field::array` builds compact float/complex results without a `Number` per item. Each caller lists the domains it supports. Compact complex input does not take a real path merely because all imaginary parts are zero; results built through `Value::complex` can normalize to float storage.
147
155
 
148
- Rustymath owns the mathematical algorithms. Basedpl owns pervasion, storage, numeric promotion, axes and language policy. Approximate matrix solve/pseudoinverse and decomposition use native rustymath factorizations. Exact solve/pseudoinverse/determinant use rational field algorithms. Generic permanent and polynomial helpers also run at floating/complex field types. Singular/wide matrix division gives least-norm solutions. LU eligibility and SVD cutoffs are rustymath policy, not duplicated here.
156
+ Rustymath owns the mathematical algorithms. Basedpl owns pervasion, storage, numeric promotion, axes and language policy. Approximate matrix solve/pseudoinverse and decomposition use rustymath factorizations. On macOS, rustymath sends much of this work to Accelerate, as its DEV.md describes. No platform-specific adapter belongs here. The Cargo configuration, for Cargo's own builds, and `pyproject.toml`, for the wheels, both set the macOS deployment minimum to 15. Exact solve/pseudoinverse/determinant use rational field algorithms. Generic permanent and polynomial helpers also run at floating/complex field types. Singular/wide matrix division gives least-norm solutions. LU eligibility and SVD cutoffs are rustymath policy, not duplicated here.
149
157
 
150
158
  `•decompose`/`•decompose⁻¹` share domain reading and `Factor` dispatch, with options for kind, vectors and complete QR. Polynomial adapters choose compact evaluation or generic field operations; gradients differentiate coefficients before evaluating. Number-theory adapters supply cancellation checks and assemble result cells. Distribution constructors expose native density/CDF/quantile/sample functions. Compact continuous calls use slice objects. Discrete samples and finite discrete quantiles are exact integers.
151
159
 
@@ -165,7 +173,7 @@ A failed compact kernel leaves placeholder results and triggers a wider/exact/co
165
173
 
166
174
  Folds by algebraic float operations can regroup. Contiguous subtraction/division folds use `Alternating`; quotients fall back to item-by-item folding if their products leave the normal range. Boolean scans compose truth-table maps; comparison scans compute both possible totals in bulk and use `reduce::chosen`. Seeds, axis lanes and scalar fallback preserve the language's accumulation direction. Generic reductions stay right-associated and preserve operand call order/effects. Monadic `f.g` is the exception: it memoizes each minor's expansion, and a cached minor does not repeat operand calls or their effects. Determinant/permanent fast paths use the appropriate rustymath backend.
167
175
 
168
- The automatic Rayon scheduler currently serves rustymath elementwise `many` and `pairs`, not general matrix products, factorizations or reduction loops. It adapts to call cost, uses `RAYON_NUM_THREADS` by default and accepts current-thread overrides through `parallel::set_threads` (0 default, 1 serial). Nested Rayon work does not split again; wasm is serial. Small converted chunks and fusion's serial outer traversal limit the work available to it. Don't infer multicore execution from a large array alone.
176
+ The automatic Rayon scheduler serves rustymath elementwise `many` and `pairs`, folds through `reduce::along`, fused chains and matrix products. Scans don't split. Decompositions split in the products of their blocked updates, the passes of their Hermitian and bidiagonal reductions, and their divide-and-conquer merges. `rank` sends dyadic `+.×` and `⌹`, monadic `⌹` and `-.×`, and `•decompose` over the 2-cells of an unkeyed stack with compact storage to `primitive::stacked` and `stacked_decompositions`. They run each cell through the rustymath function it uses alone. Rustymath's `parallel::stack_with` splits whole cells across threads in rounds, with `check_now` between rounds. A caller whose checks run far apart, such as a round or a rustymath `_with` callback, calls `check_now`, because `Context::check` reads the clock only on every 64th call. The scheduler adapts to call cost, uses `RAYON_NUM_THREADS` by default and accepts current-thread overrides through `parallel::set_threads` (0 default, 1 serial). `Session::evaluation` applies a session's `•prefs ["threads":n]` to each of its evaluations, then restores the thread's own setting. A session that never sets it keeps the evaluating thread's setting, such as the timing harness's one thread. Nested Rayon work does not split again; wasm is serial. A fused chain splits in pieces of whole blocks: an elementwise chain through `parallel::extended`, and a folded one through `reduce::fold_pieces`. On one thread an elementwise chain appends straight to its result, because copying each block into a piece's slots cost up to 1.2 copies there. Small converted chunks limit the work available to the scheduler. Don't infer multicore execution from a large array alone.
169
177
 
170
178
  Packed numeric, Boolean and equality-count inner products use `rustymath::linalg`. Integer calls use `Inner::checked` before relying on an exact compact result. Structural gather/compress and interval index also reuse rustymath. Measure generic/backend changes in both projects; callers' codegen and layout determine costs that isolated kernels miss.
171
179
 
@@ -201,7 +209,7 @@ The Jupyter adapter in `cli/src/kernel.rs` uses kernmini and a `ThreadWorker`. I
201
209
 
202
210
  ### Browser
203
211
 
204
- `cargo wasm` builds an incremental release-profile npm package with wasm-bindgen glue, language/input assets, grammar and canvas support. `--out DIR` leaves the docs' local playground assets alone; `--strip` removes function-name metadata for distribution. Keep wasm-bindgen glue and crate versions aligned through the workspace lock. Avoid fat LTO here because rebuild cost and enlarged stack frames conflict with browser development and recursion limits.
212
+ `cargo wasm` builds an incremental release-profile npm package with wasm-bindgen glue, language/input assets, grammar and canvas support. `--out DIR` leaves the docs' local playground assets alone; `--strip` removes function-name metadata for distribution. Keep wasm-bindgen glue and crate versions aligned through the workspace lock. Avoid fat LTO here because rebuild cost and enlarged stack frames conflict with browser development and recursion limits. `wasm-objdump -h DIR/basedpl_wasm_bg.wasm` lists the module's section sizes, including `name`. `twiggy diff` matches functions by full name, including crate hashes that change between builds. To compare two builds by function, compare their `twiggy top -n 1000000 -f json` listings with the hashes removed.
205
213
 
206
214
  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.
207
215
 
@@ -211,9 +219,11 @@ The playground and gallery load released assets from jsDelivr, or local `nbs/pla
211
219
 
212
220
  `system.rs` owns case-insensitive system names, valence, item mapping and result prototypes. Native records use ordinary function nodes and calls. Empty native item mapping returns its declared prototype without calling the function. `data::Options` is the shared keyed-option decoder; formats don't invent separate option parsers.
213
221
 
222
+ `minimize.rs` implements `⇄` on `rustymath::optimize`. A vector operand holds the options before the function, and a left argument binds to the function through `↣`. `Goal` evaluates the function at points in the start's layout. Where `Function::differentiable` holds, `Goal` also calls `f∂` for the gradient. `∂` itself uses the same test.
223
+
214
224
  CSV columns, JSON arrays and Python lists share `data::imported`: a non-fill finite float or any nonfinite float triggers float promotion when every number converts losslessly. Finite fills alone do not trigger it. Otherwise items keep their kinds. JSON objects/dictionaries stay mixed. Binary data uses exact bytes. Writes validate before opening and create exclusively unless overwrite is explicit. CSV/JSON/XML exports use `•csv⁻¹`, `•json⁻¹` and `•xml⁻¹`.
215
225
 
216
- `regex.rs` shares host regex state between match/replace native functions; hosts retain their own regex syntax. `xml.rs` represents keyed element trees and distinguishes XML escaping/validation from HTML raw script/style and void-element rules. SVG uses its own renderer. `image.rs` owns pixels, PNG/JPEG and APNG animations. Native/browser renderers use the MIME/byte formats their frontends support. `plot.rs` stores specs and draws SVG on demand; the renderer owns defaults/validation. Rendering options belong in their user pages and implementation comments.
226
+ `regex.rs` shares host regex state between match/replace native functions; hosts retain their own regex syntax. `xml.rs` represents keyed element trees and distinguishes XML escaping/validation from HTML raw script/style and void-element rules. SVG uses its own renderer. `image.rs` owns pictures, their options and animation timing, as plain pixel buffers. Its `codec` module decodes and encodes those buffers through ImageIO on Apple targets (`image/imageio.rs`) and through the `image` and `png` crates elsewhere (`image/codecs.rs`). Native/browser renderers use the MIME/byte formats their frontends support. `plot.rs` stores specs and draws SVG on demand; the renderer owns defaults/validation. Rendering options belong in their user pages and implementation comments.
217
227
 
218
228
  `display.rs` owns plain/boxed/function display, elision and MIME rendering. Display settings affect implicit presentation, not returned values or `⍕`; explicit output prints all items. `•mime` calls a renderer with echo disabled and cancellation active. Failed implicit rendering falls back to text; interrupts/timeouts propagate. `canvas.rs` serializes drawing data and typed bytes; `canvas.js` and `nbs/driver.js` own browser playback. Keep formatting, serialization and rich output as separate contracts.
219
229
 
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basedpl
3
- Version: 0.1.45
3
+ Version: 0.1.48
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Requires-Dist: fastcore
7
7
  Requires-Dist: fastship>=0.0.11 ; extra == 'dev'
8
- Requires-Dist: fastws-cli>=0.0.24 ; extra == 'dev'
8
+ Requires-Dist: fastws-cli>=0.0.25 ; extra == 'dev'
9
9
  Requires-Dist: maturin>=1.9.4,<2.0 ; extra == 'dev'
10
10
  Requires-Dist: pytest ; extra == 'dev'
11
11
  Requires-Dist: numpy ; extra == 'dev'
@@ -6,7 +6,7 @@
6
6
  ],
7
7
  "patterns": [
8
8
  {
9
- "begin": "⍝",
9
+ "begin": "[⍝注]",
10
10
  "beginCaptures": {
11
11
  "0": {
12
12
  "name": "comment.line.bpl"
@@ -48,15 +48,15 @@
48
48
  "name": "source.bpl"
49
49
  },
50
50
  {
51
- "match": "•[A-Za-z_∆⍙][A-Za-z0-9_∆⍙]*",
51
+ "match": "[•系][A-Za-z_∆⍙][A-Za-z0-9_∆⍙]*",
52
52
  "name": "support.function.system.bpl"
53
53
  },
54
54
  {
55
- "match": "¯?∞|¯?(\\d+(\\.\\d+)?|\\.\\d+)([eEₑ]¯?\\d+)?([jJⱼ]¯?(\\d+(\\.\\d+)?|\\.\\d+)([eEₑ]¯?\\d+)?|ₓ|[rᵣ]¯?\\d+)?",
55
+ "match": "[¯负負]?[∞永]|[¯负負]?(\\d+([.内內]\\d+)?|[.内內]\\d+)([eEₑ][¯负負]?\\d+)?([jJⱼ][¯负負]?(\\d+([.内內]\\d+)?|[.内內]\\d+)([eEₑ][¯负負]?\\d+)?|ₓ|[rᵣ][¯负負]?\\d+)?",
56
56
  "name": "constant.numeric.bpl"
57
57
  },
58
58
  {
59
- "match": "⍬ₓ?",
59
+ "match": "[⍬空]ₓ?",
60
60
  "name": "constant.numeric.bpl"
61
61
  },
62
62
  {
@@ -85,23 +85,23 @@
85
85
  }
86
86
  },
87
87
  {
88
- "match": "[\\+\\-×÷⌈⌊\\|\\*⍟○π√!∧∨⊼⊽\\~=≠<≤>≥⍳↦:⍴≢≡,⍪⊂⊃⊆∊∪∩⍋⍒↑↓⌽⊖⍉⊤⊥⍎⍕⌷⌹\\#↕⍭⨸⌻⍸⍷⊢⊣¿]",
88
+ "match": "[\\+加\\-减減×乘号號÷除⌈上⌊下\\|绝余絕餘\\*幂冪⍟对對○圆圓π周√根!阶拣階揀∧极且極∨析或⊼方否⊽双莫雙\\~非无無=等≠别初別<小≤限退>大≥达进達進⍳位↦至:键卸鍵⍴形≢数异數異≡同深,连連⍪接矩⊂包⊃选合選⊆巢段∊属展屬∪并独併獨∩交重⍋升⍒降↑取↓去拆⌽转轉⊖纵縱⍉翻⊤编編⊥译譯⍎行⍕文⌷索⌹解逆\\#复複↕窗⍭素⨸因⌻零值⍸处间處間⍷寻群尋⊢右⊣左¿掷抽擲]",
89
89
  "name": "support.function.bpl"
90
90
  },
91
91
  {
92
- "match": "[¨⍨⊗⌸∂/⌿\\\\⍀⁰¹²³⁴⁵⁶⁷⁸⁹⁻ᵀᵘ]",
92
+ "match": "[¨遍⍨己换換⊗表⌸组組⇄优優∂导梯導/总總⌿汇匯\\\\累⍀续續⁰¹²³⁴⁵⁶⁷⁸⁹⁻ᵀᵘ]",
93
93
  "name": "keyword.operator.monadic.bpl"
94
94
  },
95
95
  {
96
- "match": "[↣⍤∘⍠⍥↢\\.⍣⇄⊘@⍚⌺]",
96
+ "match": "[↣先⍤秩∘承⍠轴軸⍥经經↢后後\\.内內⍣次止⊘兼@于於⍚择擇⌺邻鄰]",
97
97
  "name": "keyword.operator.dyadic.bpl"
98
98
  },
99
99
  {
100
- "match": "[⍺⍵⍶⍹∇⍢]",
100
+ "match": "[⍺甲⍵乙⍶丙⍹丁∇递遞⍢循]",
101
101
  "name": "variable.parameter.bpl"
102
102
  },
103
103
  {
104
- "match": "[←⎕⋄\\?₀₁₂₃₄₅₆₇₈₉₋]",
104
+ "match": "[←是⎕出入⋄句\\?若₀₁₂₃₄₅₆₇₈₉₋]",
105
105
  "name": "keyword.control.bpl"
106
106
  }
107
107
  ]
@@ -459,11 +459,6 @@
459
459
  <option name="OTHER" value="true" />
460
460
  </context>
461
461
  </template>
462
- <template name="inverse-pair" value="⇄" description="⇄" shortcut="TAB">
463
- <context>
464
- <option name="OTHER" value="true" />
465
- </context>
466
- </template>
467
462
  <template name="inverted-question" value="¿" description="¿" shortcut="TAB">
468
463
  <context>
469
464
  <option name="OTHER" value="true" />
@@ -569,6 +564,11 @@
569
564
  <option name="OTHER" value="true" />
570
565
  </context>
571
566
  </template>
567
+ <template name="minimize" value="⇄" description="⇄" shortcut="TAB">
568
+ <context>
569
+ <option name="OTHER" value="true" />
570
+ </context>
571
+ </template>
572
572
  <template name="mix" value="⊃" description="⊃" shortcut="TAB">
573
573
  <context>
574
574
  <option name="OTHER" value="true" />
@@ -560,7 +560,7 @@
560
560
  <key code="16" output="⊂"/>
561
561
  <key code="17" output="∘"/>
562
562
  <key code="18" action="k18-m4"/>
563
- <key code="19" output="“"/>
563
+ <key code="19" output="⌽"/>
564
564
  <key code="20" output="√"/>
565
565
  <key code="21" output="⇄"/>
566
566
  <key code="22" output="]"/>
@@ -1347,7 +1347,7 @@
1347
1347
  <key code="23" output="&#x001B;"/>
1348
1348
  <key code="24" output="'"/>
1349
1349
  <key code="25" output="}"/>
1350
- <key code="26" output="⌽"/>
1350
+ <key code="26" output="|"/>
1351
1351
  <key code="27" output="¿"/>
1352
1352
  <key code="28" output="{"/>
1353
1353
  <key code="29" output="≠"/>
@@ -24,6 +24,7 @@ Option-z ⊂
24
24
  Option-t ∘
25
25
  Option-1 diaeresis prefix
26
26
  Option-Shift-1 ¹
27
+ Option-2 ⌽
27
28
  Option-Shift-2 ²
28
29
  Option-3 √
29
30
  Option-4 ⇄
@@ -32,7 +33,6 @@ Control-Option-6 superscript prefix
32
33
  Option-Shift-5 subscript prefix
33
34
  Option-Shift-´ ⋄
34
35
  Option-Shift-9 ∨
35
- Control-Option-7 ⌽
36
36
  Control-Option-Shift-7 ¿
37
37
  Option-Shift-8 ∞
38
38
  Option-0 ∧
@@ -690,7 +690,7 @@
690
690
  <key code="16" action="k16-m5"/>
691
691
  <key code="17" output="‡"/>
692
692
  <key code="18" action="k18-m5"/>
693
- <key code="19" output="²"/>
693
+ <key code="19" output="⌽"/>
694
694
  <key code="20" output="√"/>
695
695
  <key code="21" output="⁴"/>
696
696
  <key code="22" output="⁶"/>
@@ -1339,7 +1339,7 @@
1339
1339
  <key code="15" output="&#x0012;"/>
1340
1340
  <key code="16" output="&#x0019;"/>
1341
1341
  <key code="17" output="&#x0014;"/>
1342
- <key code="18" output="⌽"/>
1342
+ <key code="18" output="1"/>
1343
1343
  <key code="19" output="2"/>
1344
1344
  <key code="20" output="3"/>
1345
1345
  <key code="21" output="4"/>
@@ -23,8 +23,7 @@ Option-r ⍴
23
23
  Option-y •
24
24
  Option-t ∘
25
25
  Option-Shift-1 diaeresis prefix
26
- Control-Option-1 ⌽
27
- Option-Shift-2 ²
26
+ Option-Shift-2 ⌽
28
27
  Option-Shift-3 √
29
28
  Option-4 ⇄
30
29
  Option-Shift-4 ⁴