basedpl 0.1.46__tar.gz → 0.1.49__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 (445) hide show
  1. {basedpl-0.1.46 → basedpl-0.1.49}/.cargo/config.toml +4 -0
  2. {basedpl-0.1.46 → basedpl-0.1.49}/.github/workflows/ci.yml +3 -3
  3. {basedpl-0.1.46 → basedpl-0.1.49}/.gitignore +1 -0
  4. {basedpl-0.1.46 → basedpl-0.1.49}/Cargo.lock +48 -17
  5. {basedpl-0.1.46 → basedpl-0.1.49}/Cargo.toml +16 -5
  6. {basedpl-0.1.46 → basedpl-0.1.49}/DEV.md +20 -10
  7. {basedpl-0.1.46 → basedpl-0.1.49}/PKG-INFO +5 -5
  8. {basedpl-0.1.46 → basedpl-0.1.49}/README.md +3 -3
  9. {basedpl-0.1.46/python/basedpl → basedpl-0.1.49/editors/jetbrains/BPL.tmbundle/Syntaxes}/bpl.tmLanguage.json +9 -9
  10. {basedpl-0.1.46 → basedpl-0.1.49}/editors/jetbrains/BPL.xml +322 -72
  11. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.keylayout +2 -2
  12. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-de.txt +1 -1
  13. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.keylayout +2 -2
  14. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-es.txt +1 -2
  15. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.keylayout +2 -2
  16. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-fr.txt +1 -2
  17. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.keylayout +2 -2
  18. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-uk.txt +1 -1
  19. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.keylayout +2 -2
  20. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-us.txt +1 -1
  21. basedpl-0.1.49/editors/vim/syntax/bpl.vim +32 -0
  22. {basedpl-0.1.46 → basedpl-0.1.49}/editors/windows/layout.h +2 -2
  23. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/arrays.ipynb +2 -2
  24. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/assignment.ipynb +70 -3
  25. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/bpl.xml +9 -9
  26. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/data.ipynb +1 -1
  27. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/dfns.ipynb +1 -1
  28. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/distributions.ipynb +3 -3
  29. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/dyalog.ipynb +24 -96
  30. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/evaluation.qmd +1 -1
  31. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/getting-started.ipynb +2 -2
  32. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/alpha-underbar.qmd +1 -1
  33. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/alpha.qmd +1 -1
  34. basedpl-0.1.46/nbs/glyphs/under.qmd → basedpl-0.1.49/nbs/glyphs/at.qmd +5 -3
  35. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/backslash-bar.qmd +1 -1
  36. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/backslash.qmd +3 -1
  37. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/brackets.qmd +1 -1
  38. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/bullet.qmd +2 -2
  39. basedpl-0.1.46/nbs/glyphs/transpose.qmd → basedpl-0.1.49/nbs/glyphs/circle-backslash.qmd +2 -2
  40. basedpl-0.1.46/nbs/glyphs/reverse-first.qmd → basedpl-0.1.49/nbs/glyphs/circle-bar.qmd +3 -3
  41. basedpl-0.1.46/nbs/glyphs/over.qmd → basedpl-0.1.49/nbs/glyphs/circle-diaeresis.qmd +2 -2
  42. basedpl-0.1.46/nbs/glyphs/factor.qmd → basedpl-0.1.49/nbs/glyphs/circle-divide.qmd +3 -3
  43. basedpl-0.1.46/nbs/glyphs/valences.qmd → basedpl-0.1.49/nbs/glyphs/circle-slash.qmd +1 -1
  44. basedpl-0.1.46/nbs/glyphs/log.qmd → basedpl-0.1.49/nbs/glyphs/circle-star.qmd +1 -1
  45. basedpl-0.1.46/nbs/glyphs/reverse.qmd → basedpl-0.1.49/nbs/glyphs/circle-stile.qmd +3 -3
  46. basedpl-0.1.46/nbs/glyphs/outer-product.qmd → basedpl-0.1.49/nbs/glyphs/circle-times.qmd +1 -1
  47. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/circle.qmd +2 -2
  48. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/colon.qmd +2 -2
  49. basedpl-0.1.46/nbs/glyphs/table.qmd → basedpl-0.1.49/nbs/glyphs/comma-bar.qmd +1 -1
  50. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/comma.qmd +2 -2
  51. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/del-diaeresis.qmd +2 -2
  52. basedpl-0.1.46/nbs/glyphs/grade-down.qmd → basedpl-0.1.49/nbs/glyphs/del-stile.qmd +4 -4
  53. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/del.qmd +2 -2
  54. basedpl-0.1.46/nbs/glyphs/grade-up.qmd → basedpl-0.1.49/nbs/glyphs/delta-stile.qmd +3 -3
  55. basedpl-0.1.46/nbs/glyphs/each.qmd → basedpl-0.1.49/nbs/glyphs/diaeresis.qmd +1 -1
  56. basedpl-0.1.46/nbs/glyphs/agenda.qmd → basedpl-0.1.49/nbs/glyphs/diamond-underbar.qmd +1 -1
  57. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/diamond.qmd +1 -1
  58. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/domino.qmd +1 -1
  59. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/dot.qmd +7 -3
  60. basedpl-0.1.46/nbs/glyphs/drop.qmd → basedpl-0.1.49/nbs/glyphs/down-arrow.qmd +3 -3
  61. basedpl-0.1.46/nbs/glyphs/union.qmd → basedpl-0.1.49/nbs/glyphs/down-shoe.qmd +2 -2
  62. basedpl-0.1.46/nbs/glyphs/encode.qmd → basedpl-0.1.49/nbs/glyphs/down-tack.qmd +3 -3
  63. basedpl-0.1.46/nbs/glyphs/floor.qmd → basedpl-0.1.49/nbs/glyphs/downstile.qmd +1 -1
  64. basedpl-0.1.46/nbs/glyphs/find.qmd → basedpl-0.1.49/nbs/glyphs/epsilon-underbar.qmd +2 -2
  65. basedpl-0.1.46/nbs/glyphs/member.qmd → basedpl-0.1.49/nbs/glyphs/epsilon.qmd +2 -2
  66. basedpl-0.1.46/nbs/glyphs/tally.qmd → basedpl-0.1.49/nbs/glyphs/equal-underbar-slash.qmd +2 -2
  67. basedpl-0.1.46/nbs/glyphs/match.qmd → basedpl-0.1.49/nbs/glyphs/equal-underbar.qmd +2 -2
  68. basedpl-0.1.46/nbs/glyphs/equal.qmd → basedpl-0.1.49/nbs/glyphs/equals.qmd +3 -3
  69. basedpl-0.1.46/nbs/glyphs/factorial.qmd → basedpl-0.1.49/nbs/glyphs/exclamation.qmd +1 -1
  70. basedpl-0.1.46/nbs/glyphs/greater-or-equal.qmd → basedpl-0.1.49/nbs/glyphs/greater-than-or-equal.qmd +2 -2
  71. basedpl-0.1.46/nbs/glyphs/greater.qmd → basedpl-0.1.49/nbs/glyphs/greater-than.qmd +2 -2
  72. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/hash.qmd +4 -4
  73. basedpl-0.1.46/nbs/glyphs/execute.qmd → basedpl-0.1.49/nbs/glyphs/hydrant.qmd +3 -3
  74. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/infinity.qmd +1 -1
  75. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/inverted-question.qmd +1 -1
  76. basedpl-0.1.46/nbs/glyphs/where.qmd → basedpl-0.1.49/nbs/glyphs/iota-underbar.qmd +1 -1
  77. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/iota.qmd +4 -4
  78. basedpl-0.1.46/nbs/glyphs/rank.qmd → basedpl-0.1.49/nbs/glyphs/jot-diaeresis.qmd +4 -4
  79. basedpl-0.1.46/nbs/glyphs/atop.qmd → basedpl-0.1.49/nbs/glyphs/jot.qmd +2 -2
  80. basedpl-0.1.46/nbs/glyphs/comment.qmd → basedpl-0.1.49/nbs/glyphs/lamp.qmd +1 -1
  81. basedpl-0.1.46/nbs/glyphs/assign.qmd → basedpl-0.1.49/nbs/glyphs/left-arrow.qmd +2 -2
  82. basedpl-0.1.46/nbs/glyphs/nest.qmd → basedpl-0.1.49/nbs/glyphs/left-shoe-underbar.qmd +2 -2
  83. basedpl-0.1.46/nbs/glyphs/enclose.qmd → basedpl-0.1.49/nbs/glyphs/left-shoe.qmd +3 -3
  84. basedpl-0.1.46/nbs/glyphs/left.qmd → basedpl-0.1.49/nbs/glyphs/left-tack.qmd +2 -2
  85. basedpl-0.1.46/nbs/glyphs/after.qmd → basedpl-0.1.49/nbs/glyphs/left-tail-arrow.qmd +3 -3
  86. basedpl-0.1.46/nbs/glyphs/less-or-equal.qmd → basedpl-0.1.49/nbs/glyphs/less-than-or-equal.qmd +2 -2
  87. basedpl-0.1.46/nbs/glyphs/less.qmd → basedpl-0.1.49/nbs/glyphs/less-than.qmd +2 -2
  88. basedpl-0.1.46/nbs/glyphs/dash.qmd → basedpl-0.1.49/nbs/glyphs/minus.qmd +1 -1
  89. basedpl-0.1.46/nbs/glyphs/not-equal.qmd → basedpl-0.1.49/nbs/glyphs/not-equals.qmd +1 -1
  90. basedpl-0.1.46/nbs/glyphs/div.qmd → basedpl-0.1.49/nbs/glyphs/obelus.qmd +1 -1
  91. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/omega-underbar.qmd +1 -1
  92. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/omega.qmd +1 -1
  93. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/overbar.qmd +3 -3
  94. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/parentheses.qmd +1 -1
  95. basedpl-0.1.49/nbs/glyphs/partial.qmd +37 -0
  96. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/pi.qmd +2 -2
  97. basedpl-0.1.46/nbs/glyphs/add.qmd → basedpl-0.1.49/nbs/glyphs/plus.qmd +1 -1
  98. basedpl-0.1.46/nbs/glyphs/axis.qmd → basedpl-0.1.49/nbs/glyphs/quad-colon.qmd +3 -3
  99. basedpl-0.1.46/nbs/glyphs/stencil.qmd → basedpl-0.1.49/nbs/glyphs/quad-diamond.qmd +3 -3
  100. basedpl-0.1.46/nbs/glyphs/key.qmd → basedpl-0.1.49/nbs/glyphs/quad-equal.qmd +1 -1
  101. basedpl-0.1.46/nbs/glyphs/polynomial.qmd → basedpl-0.1.49/nbs/glyphs/quad-jot.qmd +4 -4
  102. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/quad.qmd +2 -2
  103. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/question.qmd +2 -0
  104. basedpl-0.1.46/nbs/glyphs/root.qmd → basedpl-0.1.49/nbs/glyphs/radical.qmd +2 -2
  105. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/rho.qmd +1 -1
  106. basedpl-0.1.46/nbs/glyphs/range.qmd → basedpl-0.1.49/nbs/glyphs/right-arrow-from-bar.qmd +3 -3
  107. basedpl-0.1.49/nbs/glyphs/right-left-arrows.qmd +160 -0
  108. basedpl-0.1.46/nbs/glyphs/mix.qmd → basedpl-0.1.49/nbs/glyphs/right-shoe.qmd +2 -2
  109. basedpl-0.1.46/nbs/glyphs/right.qmd → basedpl-0.1.49/nbs/glyphs/right-tack.qmd +2 -2
  110. basedpl-0.1.46/nbs/glyphs/before.qmd → basedpl-0.1.49/nbs/glyphs/right-tail-arrow.qmd +2 -2
  111. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/slash-bar.qmd +1 -1
  112. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/slash.qmd +4 -2
  113. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/squad.qmd +2 -2
  114. basedpl-0.1.46/nbs/glyphs/power.qmd → basedpl-0.1.49/nbs/glyphs/star-diaeresis.qmd +3 -3
  115. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/star.qmd +2 -2
  116. basedpl-0.1.46/nbs/glyphs/prime.qmd → basedpl-0.1.49/nbs/glyphs/stile-tilde.qmd +3 -3
  117. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/stile.qmd +1 -1
  118. basedpl-0.1.46/nbs/glyphs/format.qmd → basedpl-0.1.49/nbs/glyphs/thorn.qmd +2 -2
  119. basedpl-0.1.46/nbs/glyphs/commute.qmd → basedpl-0.1.49/nbs/glyphs/tilde-diaeresis.qmd +2 -2
  120. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/tilde.qmd +1 -1
  121. basedpl-0.1.46/nbs/glyphs/mul.qmd → basedpl-0.1.49/nbs/glyphs/times.qmd +2 -2
  122. basedpl-0.1.46/nbs/glyphs/take.qmd → basedpl-0.1.49/nbs/glyphs/up-arrow.qmd +1 -1
  123. basedpl-0.1.46/nbs/glyphs/windows.qmd → basedpl-0.1.49/nbs/glyphs/up-down-arrow.qmd +2 -2
  124. basedpl-0.1.46/nbs/glyphs/intersection.qmd → basedpl-0.1.49/nbs/glyphs/up-shoe.qmd +2 -2
  125. basedpl-0.1.46/nbs/glyphs/decode.qmd → basedpl-0.1.49/nbs/glyphs/up-tack.qmd +3 -3
  126. basedpl-0.1.46/nbs/glyphs/ceiling.qmd → basedpl-0.1.49/nbs/glyphs/upstile.qmd +1 -1
  127. basedpl-0.1.46/nbs/glyphs/nor.qmd → basedpl-0.1.49/nbs/glyphs/vee-bar.qmd +2 -2
  128. basedpl-0.1.46/nbs/glyphs/or.qmd → basedpl-0.1.49/nbs/glyphs/vee.qmd +2 -2
  129. basedpl-0.1.46/nbs/glyphs/nand.qmd → basedpl-0.1.49/nbs/glyphs/wedge-bar.qmd +2 -2
  130. basedpl-0.1.46/nbs/glyphs/and.qmd → basedpl-0.1.49/nbs/glyphs/wedge.qmd +2 -2
  131. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/zilde.qmd +2 -2
  132. basedpl-0.1.49/nbs/glyphs.qmd +161 -0
  133. basedpl-0.1.49/nbs/hanzi-notation-zh.ipynb +518 -0
  134. basedpl-0.1.49/nbs/hanzi-notation.ipynb +534 -0
  135. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/index.ipynb +3 -3
  136. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/keyboard.qmd +2 -2
  137. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/llms.txt +9 -6
  138. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/magics.ipynb +48 -197
  139. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/modules.qmd +8 -1
  140. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/notebooks.ipynb +27 -98
  141. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/numbers.qmd +2 -2
  142. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/principles.ipynb +1 -1
  143. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/python.ipynb +178 -482
  144. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/regex.ipynb +1 -1
  145. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/repl.qmd +3 -3
  146. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/scripts.ipynb +3 -3
  147. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/syntax.qmd +9 -3
  148. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/image.qmd +1 -1
  149. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/prefs.qmd +6 -3
  150. basedpl-0.1.49/nbs/web.ipynb +790 -0
  151. basedpl-0.1.49/nbs/xml.ipynb +928 -0
  152. basedpl-0.1.49/package-lock.json +615 -0
  153. basedpl-0.1.49/package.json +6 -0
  154. {basedpl-0.1.46 → basedpl-0.1.49}/py/Cargo.toml +5 -1
  155. {basedpl-0.1.46 → basedpl-0.1.49}/py/src/lib.rs +4 -0
  156. {basedpl-0.1.46 → basedpl-0.1.49}/pyproject.toml +5 -2
  157. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/__init__.py +4 -4
  158. {basedpl-0.1.46/editors/jetbrains/BPL.tmbundle/Syntaxes → basedpl-0.1.49/python/basedpl}/bpl.tmLanguage.json +9 -9
  159. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/bpltests.py +14 -4
  160. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/editors.py +38 -11
  161. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/functions.py +37 -15
  162. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/input.js +9 -7
  163. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/layout.json +1 -1
  164. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/lb.js +2 -2
  165. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/printing.py +25 -19
  166. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/worker.py +10 -6
  167. {basedpl-0.1.46 → basedpl-0.1.49}/src/array/storage.rs +13 -153
  168. {basedpl-0.1.46 → basedpl-0.1.49}/src/array/text.rs +7 -7
  169. {basedpl-0.1.46 → basedpl-0.1.49}/src/array.rs +2 -2
  170. {basedpl-0.1.46 → basedpl-0.1.49}/src/data.rs +1 -1
  171. {basedpl-0.1.46 → basedpl-0.1.49}/src/display.rs +17 -10
  172. {basedpl-0.1.46 → basedpl-0.1.49}/src/distribution.rs +1 -1
  173. {basedpl-0.1.46 → basedpl-0.1.49}/src/element.rs +5 -0
  174. {basedpl-0.1.46 → basedpl-0.1.49}/src/eval/assign.rs +22 -3
  175. {basedpl-0.1.46 → basedpl-0.1.49}/src/eval/dissect.rs +18 -18
  176. {basedpl-0.1.46 → basedpl-0.1.49}/src/eval/operators.rs +2 -2
  177. {basedpl-0.1.46 → basedpl-0.1.49}/src/eval/session.rs +23 -16
  178. {basedpl-0.1.46 → basedpl-0.1.49}/src/eval.rs +125 -60
  179. basedpl-0.1.49/src/image/codecs.rs +67 -0
  180. basedpl-0.1.49/src/image/imageio.rs +266 -0
  181. basedpl-0.1.49/src/image.rs +171 -0
  182. {basedpl-0.1.46 → basedpl-0.1.49}/src/inspection.rs +5 -3
  183. {basedpl-0.1.46 → basedpl-0.1.49}/src/lib.rs +1 -0
  184. {basedpl-0.1.46 → basedpl-0.1.49}/src/number.rs +1 -1
  185. basedpl-0.1.49/src/optimize.rs +234 -0
  186. {basedpl-0.1.46 → basedpl-0.1.49}/src/primitive/numeric.rs +2 -2
  187. {basedpl-0.1.46 → basedpl-0.1.49}/src/primitive.rs +102 -99
  188. {basedpl-0.1.46 → basedpl-0.1.49}/src/reference.rs +5 -2
  189. {basedpl-0.1.46 → basedpl-0.1.49}/src/symbols.rs +158 -29
  190. {basedpl-0.1.46 → basedpl-0.1.49}/src/syntax.rs +37 -26
  191. {basedpl-0.1.46 → basedpl-0.1.49}/src/system.rs +3 -1
  192. {basedpl-0.1.46 → basedpl-0.1.49}/tests/core.rs +82 -3
  193. {basedpl-0.1.46 → basedpl-0.1.49}/tests/highlighting.mjs +9 -6
  194. {basedpl-0.1.46 → basedpl-0.1.49}/tests/input.mjs +9 -1
  195. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/core.bpl +183 -16
  196. {basedpl-0.1.46 → basedpl-0.1.49}/tests/scaling.rs +4 -2
  197. {basedpl-0.1.46 → basedpl-0.1.49}/tests/speed.txt +108 -105
  198. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_api.py +81 -63
  199. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_bpltests.py +2 -0
  200. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_glyphs.py +6 -3
  201. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_ipython.py +2 -2
  202. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_kernel.py +11 -8
  203. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_repl.py +6 -6
  204. basedpl-0.1.46/editors/vim/syntax/bpl.vim +0 -32
  205. basedpl-0.1.46/nbs/glyphs/derivative.qmd +0 -28
  206. basedpl-0.1.46/nbs/glyphs/inverse-pair.qmd +0 -21
  207. basedpl-0.1.46/nbs/glyphs.qmd +0 -153
  208. basedpl-0.1.46/nbs/web.ipynb +0 -790
  209. basedpl-0.1.46/nbs/xml.ipynb +0 -928
  210. basedpl-0.1.46/src/image.rs +0 -183
  211. {basedpl-0.1.46 → basedpl-0.1.49}/.gitattributes +0 -0
  212. {basedpl-0.1.46 → basedpl-0.1.49}/.github/workflows/docs.yml +0 -0
  213. {basedpl-0.1.46 → basedpl-0.1.49}/.github/workflows/speed.yml +0 -0
  214. {basedpl-0.1.46 → basedpl-0.1.49}/.github/workflows/test.yml +0 -0
  215. {basedpl-0.1.46 → basedpl-0.1.49}/CONTRIBUTING.md +0 -0
  216. {basedpl-0.1.46 → basedpl-0.1.49}/LICENSE +0 -0
  217. {basedpl-0.1.46 → basedpl-0.1.49}/_config.yml +0 -0
  218. {basedpl-0.1.46 → basedpl-0.1.49}/_layouts/default.html +0 -0
  219. {basedpl-0.1.46 → basedpl-0.1.49}/build.rs +0 -0
  220. {basedpl-0.1.46 → basedpl-0.1.49}/editors/jetbrains/BPL.tmbundle/info.plist +0 -0
  221. {basedpl-0.1.46 → basedpl-0.1.49}/editors/jetbrains/README.md +0 -0
  222. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-de.bundle/Contents/Info.plist +0 -0
  223. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.icns +0 -0
  224. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-de.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  225. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-de.bundle/Contents/version.plist +0 -0
  226. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-es.bundle/Contents/Info.plist +0 -0
  227. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.icns +0 -0
  228. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-es.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  229. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-es.bundle/Contents/version.plist +0 -0
  230. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-fr.bundle/Contents/Info.plist +0 -0
  231. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.icns +0 -0
  232. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-fr.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  233. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-fr.bundle/Contents/version.plist +0 -0
  234. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-uk.bundle/Contents/Info.plist +0 -0
  235. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.icns +0 -0
  236. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-uk.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  237. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-uk.bundle/Contents/version.plist +0 -0
  238. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-us.bundle/Contents/Info.plist +0 -0
  239. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.icns +0 -0
  240. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-us.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  241. {basedpl-0.1.46 → basedpl-0.1.49}/editors/macos/BasedPL-us.bundle/Contents/version.plist +0 -0
  242. {basedpl-0.1.46 → basedpl-0.1.49}/editors/vim/ftdetect/bpl.vim +0 -0
  243. {basedpl-0.1.46 → basedpl-0.1.49}/editors/windows/README.md +0 -0
  244. {basedpl-0.1.46 → basedpl-0.1.49}/editors/windows/build.ps1 +0 -0
  245. {basedpl-0.1.46 → basedpl-0.1.49}/editors/windows/install.ps1 +0 -0
  246. {basedpl-0.1.46 → basedpl-0.1.49}/editors/windows/keyboard.c +0 -0
  247. {basedpl-0.1.46 → basedpl-0.1.49}/editors/windows/keyboard.def +0 -0
  248. {basedpl-0.1.46 → basedpl-0.1.49}/editors/windows/keyboard.rc +0 -0
  249. {basedpl-0.1.46 → basedpl-0.1.49}/index_files/figure-commonmark/cell-17-output-1.svg +0 -0
  250. {basedpl-0.1.46 → basedpl-0.1.49}/index_files/figure-commonmark/cell-18-output-1.svg +0 -0
  251. {basedpl-0.1.46 → basedpl-0.1.49}/index_files/figure-html/cell-17-output-1.svg +0 -0
  252. {basedpl-0.1.46 → basedpl-0.1.49}/index_files/figure-html/cell-18-output-1.svg +0 -0
  253. {basedpl-0.1.46 → basedpl-0.1.49}/lib/LICENSE-april +0 -0
  254. {basedpl-0.1.46 → basedpl-0.1.49}/lib/README.md +0 -0
  255. {basedpl-0.1.46 → basedpl-0.1.49}/lib/array.bpl +0 -0
  256. {basedpl-0.1.46 → basedpl-0.1.49}/lib/dyalog.bpl +0 -0
  257. {basedpl-0.1.46 → basedpl-0.1.49}/lib/graph.bpl +0 -0
  258. {basedpl-0.1.46 → basedpl-0.1.49}/lib/numeric.bpl +0 -0
  259. {basedpl-0.1.46 → basedpl-0.1.49}/lib/power.bpl +0 -0
  260. {basedpl-0.1.46 → basedpl-0.1.49}/lib/regex.bpl +0 -0
  261. {basedpl-0.1.46 → basedpl-0.1.49}/lib/string.bpl +0 -0
  262. {basedpl-0.1.46 → basedpl-0.1.49}/lib/tree.bpl +0 -0
  263. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/.gitignore +0 -0
  264. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/_quarto.yml +0 -0
  265. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/bqn.xml +0 -0
  266. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/bracket-types.ipynb +0 -0
  267. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/cli.qmd +0 -0
  268. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/comparison.qmd +0 -0
  269. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/driver.js +0 -0
  270. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/dyalog.xml +0 -0
  271. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/fonts/LICENSE-SAX2 +0 -0
  272. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/fonts/README.md +0 -0
  273. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/fonts/SAX2B.ttf +0 -0
  274. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/fonts/SAX2B.woff2 +0 -0
  275. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/fonts.css +0 -0
  276. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery/attractor.bpl +0 -0
  277. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery/boids.bpl +0 -0
  278. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery/dragon.bpl +0 -0
  279. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery/flow.bpl +0 -0
  280. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery/mandelbrot.bpl +0 -0
  281. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery/mandelbrot32.bpl +0 -0
  282. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery/orbits.bpl +0 -0
  283. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery/phyllotaxis.bpl +0 -0
  284. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery/prefs.bpl +0 -0
  285. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery/reaction.bpl +0 -0
  286. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/gallery.qmd +0 -0
  287. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/_metadata.yml +0 -0
  288. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/braces.qmd +0 -0
  289. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/error-guard.qmd +0 -0
  290. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/glyphs/quote.qmd +0 -0
  291. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/introspection.ipynb +0 -0
  292. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/keyed.ipynb +0 -0
  293. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/nbdev.yml +0 -0
  294. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/overview.ipynb +0 -0
  295. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/papers/aplwiki-arrays.md +0 -0
  296. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/papers/brickman-depth-1-scalars.md +0 -0
  297. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/papers/mercer-based-system.md +0 -0
  298. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/playground/bpl.js +0 -0
  299. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/playground/gallery.js +0 -0
  300. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/playground/monaco-worker.js +0 -0
  301. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/playground/page.js +0 -0
  302. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/playground/worker.js +0 -0
  303. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/playground.qmd +0 -0
  304. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/plot.ipynb +0 -0
  305. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/processes.qmd +0 -0
  306. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/puppy.jpg +0 -0
  307. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/sidebar.yml +0 -0
  308. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/strings.ipynb +0 -0
  309. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/styles.css +0 -0
  310. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/_metadata.yml +0 -0
  311. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/c.qmd +0 -0
  312. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/canvas.qmd +0 -0
  313. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/constants.qmd +0 -0
  314. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/copy.qmd +0 -0
  315. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/csv.qmd +0 -0
  316. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/date.qmd +0 -0
  317. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/decompose.qmd +0 -0
  318. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/deflate.qmd +0 -0
  319. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/delay.qmd +0 -0
  320. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/distribution.qmd +0 -0
  321. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/element.qmd +0 -0
  322. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/ex.qmd +0 -0
  323. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/fetch.qmd +0 -0
  324. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/float.qmd +0 -0
  325. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/hash.qmd +0 -0
  326. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/host.qmd +0 -0
  327. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/js.qmd +0 -0
  328. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/json.qmd +0 -0
  329. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/literal.qmd +0 -0
  330. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/load.qmd +0 -0
  331. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/metadata.qmd +0 -0
  332. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/mime.qmd +0 -0
  333. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/mkdir.qmd +0 -0
  334. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/nc.qmd +0 -0
  335. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/nget.qmd +0 -0
  336. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/nl.qmd +0 -0
  337. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/normalize.qmd +0 -0
  338. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/nput.qmd +0 -0
  339. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/path.qmd +0 -0
  340. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/plot.qmd +0 -0
  341. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/r.qmd +0 -0
  342. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/rand.qmd +0 -0
  343. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/readdir.qmd +0 -0
  344. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/remove.qmd +0 -0
  345. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/rename.qmd +0 -0
  346. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/signal.qmd +0 -0
  347. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/src.qmd +0 -0
  348. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/storage.qmd +0 -0
  349. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/svg.qmd +0 -0
  350. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/time.qmd +0 -0
  351. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/ucs.qmd +0 -0
  352. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/uuid.qmd +0 -0
  353. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/vfi.qmd +0 -0
  354. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system/xml.qmd +0 -0
  355. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/system-functions.qmd +0 -0
  356. {basedpl-0.1.46 → basedpl-0.1.49}/nbs/terms.qmd +0 -0
  357. {basedpl-0.1.46 → basedpl-0.1.49}/provenance/README.md +0 -0
  358. {basedpl-0.1.46 → basedpl-0.1.49}/provenance/aplcart.jsonl +0 -0
  359. {basedpl-0.1.46 → basedpl-0.1.49}/provenance/april.jsonl +0 -0
  360. {basedpl-0.1.46 → basedpl-0.1.49}/provenance/bqn.jsonl +0 -0
  361. {basedpl-0.1.46 → basedpl-0.1.49}/provenance/core.jsonl +0 -0
  362. {basedpl-0.1.46 → basedpl-0.1.49}/provenance/dyalog.jsonl +0 -0
  363. {basedpl-0.1.46 → basedpl-0.1.49}/provenance/ngn.jsonl +0 -0
  364. {basedpl-0.1.46 → basedpl-0.1.49}/py/build.rs +0 -0
  365. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/_modidx.py +0 -0
  366. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/dyalog.py +0 -0
  367. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/font.py +0 -0
  368. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/fonts.css +0 -0
  369. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/ipython.py +0 -0
  370. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/keyboards.json +0 -0
  371. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/keyboards.py +0 -0
  372. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/notebook_runner.py +0 -0
  373. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/notebooks.py +0 -0
  374. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/reference.py +0 -0
  375. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/syntax.py +0 -0
  376. {basedpl-0.1.46 → basedpl-0.1.49}/python/basedpl/windows_keyboard.py +0 -0
  377. {basedpl-0.1.46 → basedpl-0.1.49}/rustfmt.toml +0 -0
  378. {basedpl-0.1.46 → basedpl-0.1.49}/scripts/install-macos.sh +0 -0
  379. {basedpl-0.1.46 → basedpl-0.1.49}/scripts/prep.py +0 -0
  380. {basedpl-0.1.46 → basedpl-0.1.49}/src/agreement.rs +0 -0
  381. {basedpl-0.1.46 → basedpl-0.1.49}/src/canvas.js +0 -0
  382. {basedpl-0.1.46 → basedpl-0.1.49}/src/canvas.rs +0 -0
  383. {basedpl-0.1.46 → basedpl-0.1.49}/src/csv.rs +0 -0
  384. {basedpl-0.1.46 → basedpl-0.1.49}/src/date.rs +0 -0
  385. {basedpl-0.1.46 → basedpl-0.1.49}/src/error.rs +0 -0
  386. {basedpl-0.1.46 → basedpl-0.1.49}/src/eval/binder.rs +0 -0
  387. {basedpl-0.1.46 → basedpl-0.1.49}/src/execution.rs +0 -0
  388. {basedpl-0.1.46 → basedpl-0.1.49}/src/files.rs +0 -0
  389. {basedpl-0.1.46 → basedpl-0.1.49}/src/fusion.rs +0 -0
  390. {basedpl-0.1.46 → basedpl-0.1.49}/src/host.rs +0 -0
  391. {basedpl-0.1.46 → basedpl-0.1.49}/src/host_web.rs +0 -0
  392. {basedpl-0.1.46 → basedpl-0.1.49}/src/js.rs +0 -0
  393. {basedpl-0.1.46 → basedpl-0.1.49}/src/json.rs +0 -0
  394. {basedpl-0.1.46 → basedpl-0.1.49}/src/keyed.rs +0 -0
  395. {basedpl-0.1.46 → basedpl-0.1.49}/src/number_theory.rs +0 -0
  396. {basedpl-0.1.46 → basedpl-0.1.49}/src/pervasive.rs +0 -0
  397. {basedpl-0.1.46 → basedpl-0.1.49}/src/plot.rs +0 -0
  398. {basedpl-0.1.46 → basedpl-0.1.49}/src/polynomial.rs +0 -0
  399. {basedpl-0.1.46 → basedpl-0.1.49}/src/primitive/indexing.rs +0 -0
  400. {basedpl-0.1.46 → basedpl-0.1.49}/src/primitive/search.rs +0 -0
  401. {basedpl-0.1.46 → basedpl-0.1.49}/src/primitive/structural.rs +0 -0
  402. {basedpl-0.1.46 → basedpl-0.1.49}/src/protocol.rs +0 -0
  403. {basedpl-0.1.46 → basedpl-0.1.49}/src/regex.rs +0 -0
  404. {basedpl-0.1.46 → basedpl-0.1.49}/src/search.rs +0 -0
  405. {basedpl-0.1.46 → basedpl-0.1.49}/src/selection.rs +0 -0
  406. {basedpl-0.1.46 → basedpl-0.1.49}/src/timing.rs +0 -0
  407. {basedpl-0.1.46 → basedpl-0.1.49}/src/xml.rs +0 -0
  408. {basedpl-0.1.46 → basedpl-0.1.49}/tests/conftest.py +0 -0
  409. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/LICENSE-aplcart +0 -0
  410. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/LICENSE-april +0 -0
  411. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/LICENSE-bqn +0 -0
  412. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/LICENSE-bqncrate +0 -0
  413. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/LICENSE-dyalog +0 -0
  414. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/LICENSE-ngn +0 -0
  415. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/README.md +0 -0
  416. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/aplcart.bpl +0 -0
  417. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/april.bpl +0 -0
  418. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/bqn.bpl +0 -0
  419. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/distributions.bpl +0 -0
  420. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/dyalog.bpl +0 -0
  421. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/graphics.bpl +0 -0
  422. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/lib.bpl +0 -0
  423. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/ngn.bpl +0 -0
  424. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/regex.bpl +0 -0
  425. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/support/april.bpl +0 -0
  426. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/support/avl.bpl +0 -0
  427. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/support/redblack.bpl +0 -0
  428. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/support/sbst.bpl +0 -0
  429. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference/support/splay.bpl +0 -0
  430. {basedpl-0.1.46 → basedpl-0.1.49}/tests/reference.rs +0 -0
  431. {basedpl-0.1.46 → basedpl-0.1.49}/tests/speed.rs +0 -0
  432. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_basic.py +0 -0
  433. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_graphics.py +0 -0
  434. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_keylayout.py +0 -0
  435. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_notebooks.py +0 -0
  436. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_reference.py +0 -0
  437. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_windows_keyboard.py +0 -0
  438. {basedpl-0.1.46 → basedpl-0.1.49}/tests/test_worker.py +0 -0
  439. {basedpl-0.1.46 → basedpl-0.1.49}/tests/timing-lock.mjs +0 -0
  440. {basedpl-0.1.46 → basedpl-0.1.49}/tests/units.rs +0 -0
  441. {basedpl-0.1.46 → basedpl-0.1.49}/tests/wasm-pkg.mjs +0 -0
  442. {basedpl-0.1.46 → basedpl-0.1.49}/tests/wasm-speed.mjs +0 -0
  443. {basedpl-0.1.46 → basedpl-0.1.49}/tests/wasm.mjs +0 -0
  444. {basedpl-0.1.46 → basedpl-0.1.49}/tests/windows_keyboard.c +0 -0
  445. {basedpl-0.1.46 → basedpl-0.1.49}/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.46"
96
+ version = "0.1.49"
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.46"
143
+ version = "0.1.49"
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.46"
157
+ version = "0.1.49"
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.46"
172
+ version = "0.1.49"
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.15"
1420
+ version = "0.1.19"
1402
1421
  source = "registry+https://github.com/rust-lang/crates.io-index"
1403
- checksum = "b46e74f7d197774cef564fcf8f4f73984857abbf67c406b09d199f130821a642"
1422
+ checksum = "708c702fa9ff66ef712a124e51aa467e699a322e4cc8aebdd83c4ce05e7e592b"
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.46"
2086
+ version = "0.1.49"
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.46"
5
+ version = "0.1.49"
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.15, <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"] }
@@ -20,7 +20,11 @@ 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. To compare a change with the build before it, copy the installed `bpl` before the change, then time both copies in turn through `basedpl.worker.Worker(command=(path, '--worker'))` with the `costs` request that `speed_costs` sends. Don't restore old code in the shared tree to get a baseline.
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
+
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. A case can appear in more than one section, such as `[copies]` and `[widths]`. `sections=` limits the change to the sections it names. 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.
24
28
 
25
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
 
@@ -28,15 +32,15 @@ Run `cargo wasm` during development only for browser work. Agents use `cargo was
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.
@@ -93,9 +99,11 @@ 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
- 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.
106
+ Dot names rewrite to Pick, and dot brackets/subscripts to selection. Dot parentheses evaluate a namespace: `T.(expr)` and `T⍎text` bind each key on the first axis of `T` to its item or major cell as a local, 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.
99
107
 
100
108
  Lexical frames use non-owning parent indices. Closures see live bindings, not snapshots. Plain assignment is local; modified/selective assignment updates the nearest existing binding. Retain the resolved owner and original array across modifier calls rather than looking the name up again. Returns and outer writes reject functions, including those nested in arrays/prototypes, whose frames would not survive. Tail calls retain dependencies from arguments and the called function. No collector is used; recheck this lifetime reasoning before permitting escaping lexical captures.
101
109
 
@@ -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
 
@@ -145,7 +153,7 @@ Only f64 comparisons use the session tolerance, from 0 to `1E-14`. f32/f16 compa
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
 
@@ -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
+ `optimize.rs` implements `⇄` on `rustymath::optimize`. The left argument holds the options. `Goal` evaluates the function at points in the start's layout for `minimize`. Where `Function::differentiable` holds, `Goal` also calls `f∂` for the gradient. `∂` itself uses the same test. With `"solve":$t`, `Residual` is the `Mapping` that `solve` takes, or that `solve_affine` takes with `"linear":$t` as well. An attached derivative gives its vector–Jacobian products, and the function in option `precondition` gives its preconditioner.
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.46
3
+ Version: 0.1.49
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'
@@ -188,11 +188,11 @@ Under (`@`) transforms the argument, applies a function, then reverses the trans
188
188
 
189
189
  1.2 2.7
190
190
 
191
- Explore [iteration and inverses](https://answerdotai.github.io/basedpl/glyphs/power.html), [Under](https://answerdotai.github.io/basedpl/glyphs/under.html), [windows](https://answerdotai.github.io/basedpl/glyphs/windows.html) and [function selection](https://answerdotai.github.io/basedpl/glyphs/agenda.html).
191
+ Explore [iteration and inverses](https://answerdotai.github.io/basedpl/glyphs/star-diaeresis.html), [Under](https://answerdotai.github.io/basedpl/glyphs/at.html), [windows](https://answerdotai.github.io/basedpl/glyphs/up-down-arrow.html) and [function selection](https://answerdotai.github.io/basedpl/glyphs/diamond-underbar.html).
192
192
 
193
193
  ### Mathematical tools
194
194
 
195
- [Primes](https://answerdotai.github.io/basedpl/glyphs/prime.html) and [factorisation](https://answerdotai.github.io/basedpl/glyphs/factor.html) are built in:
195
+ [Primes](https://answerdotai.github.io/basedpl/glyphs/stile-tilde.html) and [factorisation](https://answerdotai.github.io/basedpl/glyphs/circle-divide.html) are built in:
196
196
 
197
197
  ``` bpl
198
198
  ⨸360ₓ
@@ -200,7 +200,7 @@ Explore [iteration and inverses](https://answerdotai.github.io/basedpl/glyphs/po
200
200
 
201
201
  [2 2 2 3 3 5]ₓ
202
202
 
203
- [Polynomials](https://answerdotai.github.io/basedpl/glyphs/polynomial.html) support coefficients, roots and evaluation. Polynomial functions can be [differentiated](https://answerdotai.github.io/basedpl/glyphs/derivative.html): for f(x) = 1 + 2x + 3x², f′(2) = 14.
203
+ [Polynomials](https://answerdotai.github.io/basedpl/glyphs/quad-jot.html) support coefficients, roots and evaluation. Polynomial functions can be [differentiated](https://answerdotai.github.io/basedpl/glyphs/partial.html): for f(x) = 1 + 2x + 3x², f′(2) = 14.
204
204
 
205
205
  ``` bpl
206
206
  f←[1 2 3]ₓ⌻ ⋄ f∂2ₓ
@@ -160,11 +160,11 @@ Under (`@`) transforms the argument, applies a function, then reverses the trans
160
160
 
161
161
  1.2 2.7
162
162
 
163
- Explore [iteration and inverses](https://answerdotai.github.io/basedpl/glyphs/power.html), [Under](https://answerdotai.github.io/basedpl/glyphs/under.html), [windows](https://answerdotai.github.io/basedpl/glyphs/windows.html) and [function selection](https://answerdotai.github.io/basedpl/glyphs/agenda.html).
163
+ Explore [iteration and inverses](https://answerdotai.github.io/basedpl/glyphs/star-diaeresis.html), [Under](https://answerdotai.github.io/basedpl/glyphs/at.html), [windows](https://answerdotai.github.io/basedpl/glyphs/up-down-arrow.html) and [function selection](https://answerdotai.github.io/basedpl/glyphs/diamond-underbar.html).
164
164
 
165
165
  ### Mathematical tools
166
166
 
167
- [Primes](https://answerdotai.github.io/basedpl/glyphs/prime.html) and [factorisation](https://answerdotai.github.io/basedpl/glyphs/factor.html) are built in:
167
+ [Primes](https://answerdotai.github.io/basedpl/glyphs/stile-tilde.html) and [factorisation](https://answerdotai.github.io/basedpl/glyphs/circle-divide.html) are built in:
168
168
 
169
169
  ``` bpl
170
170
  ⨸360ₓ
@@ -172,7 +172,7 @@ Explore [iteration and inverses](https://answerdotai.github.io/basedpl/glyphs/po
172
172
 
173
173
  [2 2 2 3 3 5]ₓ
174
174
 
175
- [Polynomials](https://answerdotai.github.io/basedpl/glyphs/polynomial.html) support coefficients, roots and evaluation. Polynomial functions can be [differentiated](https://answerdotai.github.io/basedpl/glyphs/derivative.html): for f(x) = 1 + 2x + 3x², f′(2) = 14.
175
+ [Polynomials](https://answerdotai.github.io/basedpl/glyphs/quad-jot.html) support coefficients, roots and evaluation. Polynomial functions can be [differentiated](https://answerdotai.github.io/basedpl/glyphs/partial.html): for f(x) = 1 + 2x + 3x², f′(2) = 14.
176
176
 
177
177
  ``` bpl
178
178
  f←[1 2 3]ₓ⌻ ⋄ f∂2ₓ
@@ -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
  ]