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.
- {basedpl-0.1.45 → basedpl-0.1.48}/.cargo/config.toml +4 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/.github/workflows/ci.yml +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/.gitignore +1 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/Cargo.lock +48 -17
- {basedpl-0.1.45 → basedpl-0.1.48}/Cargo.toml +16 -5
- {basedpl-0.1.45 → basedpl-0.1.48}/DEV.md +26 -16
- {basedpl-0.1.45 → basedpl-0.1.48}/PKG-INFO +2 -2
- {basedpl-0.1.45/python/basedpl → basedpl-0.1.48/editors/jetbrains/BPL.tmbundle/Syntaxes}/bpl.tmLanguage.json +9 -9
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/jetbrains/BPL.xml +5 -5
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.keylayout +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.txt +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.keylayout +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.txt +1 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.keylayout +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.txt +1 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.keylayout +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.txt +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.keylayout +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.txt +1 -1
- basedpl-0.1.48/editors/vim/syntax/bpl.vim +32 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/layout.h +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/lib/array.bpl +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/lib/dyalog.bpl +4 -4
- {basedpl-0.1.45 → basedpl-0.1.48}/lib/graph.bpl +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/lib/numeric.bpl +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/lib/tree.bpl +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/arrays.ipynb +4 -4
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/assignment.ipynb +70 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/bpl.xml +9 -9
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/comparison.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/data.ipynb +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/dfns.ipynb +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/distributions.ipynb +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/dyalog.ipynb +24 -96
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/evaluation.qmd +3 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/phyllotaxis.bpl +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/getting-started.ipynb +2 -2
- basedpl-0.1.45/nbs/glyphs/under.qmd → basedpl-0.1.48/nbs/glyphs/at.qmd +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/backslash.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/brackets.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/bullet.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/transpose.qmd → basedpl-0.1.48/nbs/glyphs/circle-backslash.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/reverse-first.qmd → basedpl-0.1.48/nbs/glyphs/circle-bar.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/over.qmd → basedpl-0.1.48/nbs/glyphs/circle-diaeresis.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/factor.qmd → basedpl-0.1.48/nbs/glyphs/circle-divide.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/reverse.qmd → basedpl-0.1.48/nbs/glyphs/circle-stile.qmd +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/circle.qmd +7 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/colon.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/comma.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/del-diaeresis.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/grade-down.qmd → basedpl-0.1.48/nbs/glyphs/del-stile.qmd +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/del.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/grade-up.qmd → basedpl-0.1.48/nbs/glyphs/delta-stile.qmd +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/dot.qmd +3 -3
- basedpl-0.1.45/nbs/glyphs/drop.qmd → basedpl-0.1.48/nbs/glyphs/down-arrow.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/union.qmd → basedpl-0.1.48/nbs/glyphs/down-shoe.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/encode.qmd → basedpl-0.1.48/nbs/glyphs/down-tack.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/floor.qmd → basedpl-0.1.48/nbs/glyphs/downstile.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/find.qmd → basedpl-0.1.48/nbs/glyphs/epsilon-underbar.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/member.qmd → basedpl-0.1.48/nbs/glyphs/epsilon.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/tally.qmd → basedpl-0.1.48/nbs/glyphs/equal-underbar-slash.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/match.qmd → basedpl-0.1.48/nbs/glyphs/equal-underbar.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/equal.qmd → basedpl-0.1.48/nbs/glyphs/equals.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/greater-or-equal.qmd → basedpl-0.1.48/nbs/glyphs/greater-than-or-equal.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/greater.qmd → basedpl-0.1.48/nbs/glyphs/greater-than.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/hash.qmd +3 -3
- basedpl-0.1.45/nbs/glyphs/execute.qmd → basedpl-0.1.48/nbs/glyphs/hydrant.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/iota.qmd +3 -3
- basedpl-0.1.45/nbs/glyphs/rank.qmd → basedpl-0.1.48/nbs/glyphs/jot-diaeresis.qmd +3 -3
- basedpl-0.1.45/nbs/glyphs/atop.qmd → basedpl-0.1.48/nbs/glyphs/jot.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/assign.qmd → basedpl-0.1.48/nbs/glyphs/left-arrow.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/nest.qmd → basedpl-0.1.48/nbs/glyphs/left-shoe-underbar.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/enclose.qmd → basedpl-0.1.48/nbs/glyphs/left-shoe.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/left.qmd → basedpl-0.1.48/nbs/glyphs/left-tack.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/after.qmd → basedpl-0.1.48/nbs/glyphs/left-tail-arrow.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/less-or-equal.qmd → basedpl-0.1.48/nbs/glyphs/less-than-or-equal.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/less.qmd → basedpl-0.1.48/nbs/glyphs/less-than.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/overbar.qmd +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/parentheses.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/derivative.qmd → basedpl-0.1.48/nbs/glyphs/partial.qmd +11 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/pi.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/axis.qmd → basedpl-0.1.48/nbs/glyphs/quad-colon.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/stencil.qmd → basedpl-0.1.48/nbs/glyphs/quad-diamond.qmd +5 -5
- basedpl-0.1.45/nbs/glyphs/key.qmd → basedpl-0.1.48/nbs/glyphs/quad-equal.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/polynomial.qmd → basedpl-0.1.48/nbs/glyphs/quad-jot.qmd +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/quad.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/root.qmd → basedpl-0.1.48/nbs/glyphs/radical.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/range.qmd → basedpl-0.1.48/nbs/glyphs/right-arrow-from-bar.qmd +2 -2
- basedpl-0.1.48/nbs/glyphs/right-left-arrows.qmd +87 -0
- basedpl-0.1.45/nbs/glyphs/mix.qmd → basedpl-0.1.48/nbs/glyphs/right-shoe.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/right.qmd → basedpl-0.1.48/nbs/glyphs/right-tack.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/before.qmd → basedpl-0.1.48/nbs/glyphs/right-tail-arrow.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/slash.qmd +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/squad.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/power.qmd → basedpl-0.1.48/nbs/glyphs/star-diaeresis.qmd +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/star.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/prime.qmd → basedpl-0.1.48/nbs/glyphs/stile-tilde.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/format.qmd → basedpl-0.1.48/nbs/glyphs/thorn.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/commute.qmd → basedpl-0.1.48/nbs/glyphs/tilde-diaeresis.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/mul.qmd → basedpl-0.1.48/nbs/glyphs/times.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/windows.qmd → basedpl-0.1.48/nbs/glyphs/up-down-arrow.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/intersection.qmd → basedpl-0.1.48/nbs/glyphs/up-shoe.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/decode.qmd → basedpl-0.1.48/nbs/glyphs/up-tack.qmd +2 -2
- basedpl-0.1.45/nbs/glyphs/ceiling.qmd → basedpl-0.1.48/nbs/glyphs/upstile.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/nor.qmd → basedpl-0.1.48/nbs/glyphs/vee-bar.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/or.qmd → basedpl-0.1.48/nbs/glyphs/vee.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/nand.qmd → basedpl-0.1.48/nbs/glyphs/wedge-bar.qmd +1 -1
- basedpl-0.1.45/nbs/glyphs/and.qmd → basedpl-0.1.48/nbs/glyphs/wedge.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/zilde.qmd +1 -1
- basedpl-0.1.48/nbs/glyphs.qmd +154 -0
- basedpl-0.1.48/nbs/hanzi-notation-zh.ipynb +518 -0
- basedpl-0.1.48/nbs/hanzi-notation.ipynb +534 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/index.ipynb +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/keyboard.qmd +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/keyed.ipynb +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/llms.txt +10 -7
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/magics.ipynb +48 -197
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/notebooks.ipynb +27 -98
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/numbers.qmd +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/principles.ipynb +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/python.ipynb +178 -482
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/regex.ipynb +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/repl.qmd +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/scripts.ipynb +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/syntax.qmd +12 -5
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/decompose.qmd +8 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/image.qmd +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/prefs.qmd +10 -3
- basedpl-0.1.48/nbs/web.ipynb +790 -0
- basedpl-0.1.48/nbs/xml.ipynb +928 -0
- basedpl-0.1.48/package-lock.json +615 -0
- basedpl-0.1.48/package.json +6 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/py/Cargo.toml +5 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/py/src/lib.rs +4 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/pyproject.toml +5 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/__init__.py +3 -3
- {basedpl-0.1.45/editors/jetbrains/BPL.tmbundle/Syntaxes → basedpl-0.1.48/python/basedpl}/bpl.tmLanguage.json +9 -9
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/bpltests.py +11 -4
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/editors.py +18 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/functions.py +48 -15
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/input.js +9 -7
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/layout.json +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/lb.js +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/printing.py +25 -19
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/worker.py +10 -6
- {basedpl-0.1.45 → basedpl-0.1.48}/src/array/storage.rs +27 -157
- {basedpl-0.1.45 → basedpl-0.1.48}/src/array/text.rs +9 -9
- {basedpl-0.1.45 → basedpl-0.1.48}/src/array.rs +122 -50
- {basedpl-0.1.45 → basedpl-0.1.48}/src/data.rs +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/src/display.rs +29 -14
- {basedpl-0.1.45 → basedpl-0.1.48}/src/distribution.rs +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/src/element.rs +20 -16
- {basedpl-0.1.45 → basedpl-0.1.48}/src/eval/assign.rs +22 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/src/eval/binder.rs +124 -66
- {basedpl-0.1.45 → basedpl-0.1.48}/src/eval/dissect.rs +18 -18
- {basedpl-0.1.45 → basedpl-0.1.48}/src/eval/operators.rs +60 -13
- {basedpl-0.1.45 → basedpl-0.1.48}/src/eval/session.rs +24 -16
- {basedpl-0.1.45 → basedpl-0.1.48}/src/eval.rs +132 -62
- {basedpl-0.1.45 → basedpl-0.1.48}/src/execution.rs +7 -6
- {basedpl-0.1.45 → basedpl-0.1.48}/src/fusion.rs +59 -34
- basedpl-0.1.48/src/image/codecs.rs +67 -0
- basedpl-0.1.48/src/image/imageio.rs +266 -0
- basedpl-0.1.48/src/image.rs +171 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/inspection.rs +5 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/src/keyed.rs +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/src/lib.rs +2 -1
- basedpl-0.1.48/src/minimize.rs +167 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/number.rs +5 -13
- {basedpl-0.1.45 → basedpl-0.1.48}/src/number_theory.rs +7 -7
- {basedpl-0.1.45 → basedpl-0.1.48}/src/pervasive.rs +127 -86
- {basedpl-0.1.45 → basedpl-0.1.48}/src/plot.rs +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/src/polynomial.rs +5 -5
- {basedpl-0.1.45 → basedpl-0.1.48}/src/primitive/indexing.rs +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/src/primitive/numeric.rs +127 -30
- {basedpl-0.1.45 → basedpl-0.1.48}/src/primitive/search.rs +22 -18
- {basedpl-0.1.45 → basedpl-0.1.48}/src/primitive/structural.rs +12 -14
- {basedpl-0.1.45 → basedpl-0.1.48}/src/primitive.rs +107 -104
- {basedpl-0.1.45 → basedpl-0.1.48}/src/search.rs +19 -5
- {basedpl-0.1.45 → basedpl-0.1.48}/src/selection.rs +1 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/src/symbols.rs +158 -29
- {basedpl-0.1.45 → basedpl-0.1.48}/src/syntax.rs +53 -31
- {basedpl-0.1.45 → basedpl-0.1.48}/src/system.rs +4 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/core.rs +90 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/highlighting.mjs +9 -6
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/input.mjs +9 -1
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/aplcart.bpl +33 -33
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/april.bpl +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/bqn.bpl +12 -12
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/core.bpl +134 -25
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/ngn.bpl +3 -3
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/scaling.rs +4 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/speed.txt +178 -167
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_api.py +79 -63
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_glyphs.py +5 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_ipython.py +2 -2
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_kernel.py +11 -8
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_repl.py +6 -6
- basedpl-0.1.45/editors/vim/syntax/bpl.vim +0 -32
- basedpl-0.1.45/nbs/glyphs/inverse-pair.qmd +0 -21
- basedpl-0.1.45/nbs/glyphs.qmd +0 -153
- basedpl-0.1.45/nbs/web.ipynb +0 -790
- basedpl-0.1.45/nbs/xml.ipynb +0 -928
- basedpl-0.1.45/src/image.rs +0 -181
- {basedpl-0.1.45 → basedpl-0.1.48}/.gitattributes +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/.github/workflows/docs.yml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/.github/workflows/speed.yml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/.github/workflows/test.yml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/CONTRIBUTING.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/LICENSE +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/README.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/_config.yml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/_layouts/default.html +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/build.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/jetbrains/BPL.tmbundle/info.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/jetbrains/README.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.bundle/Contents/Info.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.icns +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-de.bundle/Contents/version.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.bundle/Contents/Info.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.icns +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-es.bundle/Contents/version.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.bundle/Contents/Info.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.icns +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-fr.bundle/Contents/version.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.bundle/Contents/Info.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.icns +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-uk.bundle/Contents/version.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.bundle/Contents/Info.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.icns +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/macos/BasedPL-us.bundle/Contents/version.plist +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/vim/ftdetect/bpl.vim +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/README.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/build.ps1 +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/install.ps1 +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/keyboard.c +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/keyboard.def +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/editors/windows/keyboard.rc +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/index_files/figure-commonmark/cell-17-output-1.svg +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/index_files/figure-commonmark/cell-18-output-1.svg +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/index_files/figure-html/cell-17-output-1.svg +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/index_files/figure-html/cell-18-output-1.svg +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/lib/LICENSE-april +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/lib/README.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/lib/power.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/lib/regex.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/lib/string.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/.gitignore +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/_quarto.yml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/bqn.xml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/bracket-types.ipynb +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/cli.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/driver.js +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/dyalog.xml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/fonts/LICENSE-SAX2 +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/fonts/README.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/fonts/SAX2B.ttf +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/fonts/SAX2B.woff2 +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/fonts.css +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/attractor.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/boids.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/dragon.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/flow.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/mandelbrot.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/mandelbrot32.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/orbits.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/prefs.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery/reaction.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/gallery.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/_metadata.yml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/alpha-underbar.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/alpha.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/backslash-bar.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/braces.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/valences.qmd → /basedpl-0.1.48/nbs/glyphs/circle-slash.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/log.qmd → /basedpl-0.1.48/nbs/glyphs/circle-star.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/outer-product.qmd → /basedpl-0.1.48/nbs/glyphs/circle-times.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/table.qmd → /basedpl-0.1.48/nbs/glyphs/comma-bar.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/each.qmd → /basedpl-0.1.48/nbs/glyphs/diaeresis.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/agenda.qmd → /basedpl-0.1.48/nbs/glyphs/diamond-underbar.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/diamond.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/domino.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/error-guard.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/factorial.qmd → /basedpl-0.1.48/nbs/glyphs/exclamation.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/infinity.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/inverted-question.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/where.qmd → /basedpl-0.1.48/nbs/glyphs/iota-underbar.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/comment.qmd → /basedpl-0.1.48/nbs/glyphs/lamp.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/dash.qmd → /basedpl-0.1.48/nbs/glyphs/minus.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/not-equal.qmd → /basedpl-0.1.48/nbs/glyphs/not-equals.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/div.qmd → /basedpl-0.1.48/nbs/glyphs/obelus.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/omega-underbar.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/omega.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/add.qmd → /basedpl-0.1.48/nbs/glyphs/plus.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/question.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/quote.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/rho.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/slash-bar.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/stile.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/glyphs/tilde.qmd +0 -0
- /basedpl-0.1.45/nbs/glyphs/take.qmd → /basedpl-0.1.48/nbs/glyphs/up-arrow.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/introspection.ipynb +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/modules.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/nbdev.yml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/overview.ipynb +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/papers/aplwiki-arrays.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/papers/brickman-depth-1-scalars.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/papers/mercer-based-system.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground/bpl.js +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground/gallery.js +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground/monaco-worker.js +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground/page.js +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground/worker.js +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/playground.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/plot.ipynb +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/processes.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/puppy.jpg +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/sidebar.yml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/strings.ipynb +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/styles.css +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/_metadata.yml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/c.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/canvas.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/constants.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/copy.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/csv.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/date.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/deflate.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/delay.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/distribution.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/element.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/ex.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/fetch.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/float.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/hash.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/host.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/js.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/json.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/literal.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/load.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/metadata.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/mime.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/mkdir.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/nc.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/nget.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/nl.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/normalize.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/nput.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/path.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/plot.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/r.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/rand.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/readdir.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/remove.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/rename.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/signal.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/src.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/storage.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/svg.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/time.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/ucs.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/uuid.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/vfi.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system/xml.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/system-functions.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/nbs/terms.qmd +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/provenance/README.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/provenance/aplcart.jsonl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/provenance/april.jsonl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/provenance/bqn.jsonl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/provenance/core.jsonl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/provenance/dyalog.jsonl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/provenance/ngn.jsonl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/py/build.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/_modidx.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/dyalog.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/font.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/fonts.css +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/ipython.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/keyboards.json +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/keyboards.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/notebook_runner.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/notebooks.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/reference.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/syntax.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/python/basedpl/windows_keyboard.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/rustfmt.toml +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/scripts/install-macos.sh +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/scripts/prep.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/agreement.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/canvas.js +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/canvas.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/csv.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/date.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/error.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/files.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/host.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/host_web.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/js.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/json.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/protocol.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/reference.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/regex.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/timing.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/src/xml.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/conftest.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-aplcart +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-april +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-bqn +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-bqncrate +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-dyalog +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/LICENSE-ngn +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/README.md +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/distributions.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/dyalog.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/graphics.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/lib.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/regex.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/support/april.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/support/avl.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/support/redblack.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/support/sbst.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference/support/splay.bpl +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/reference.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/speed.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_basic.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_bpltests.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_graphics.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_keylayout.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_notebooks.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_reference.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_windows_keyboard.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/test_worker.py +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/timing-lock.mjs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/units.rs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/wasm-pkg.mjs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/wasm-speed.mjs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/wasm.mjs +0 -0
- {basedpl-0.1.45 → basedpl-0.1.48}/tests/windows_keyboard.c +0 -0
- {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.
|
|
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.
|
|
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 }}
|
|
@@ -93,7 +93,7 @@ checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5"
|
|
|
93
93
|
|
|
94
94
|
[[package]]
|
|
95
95
|
name = "basedpl"
|
|
96
|
-
version = "0.1.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
497
|
+
version = "1.0.3"
|
|
497
498
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
498
|
-
checksum = "
|
|
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.
|
|
864
|
+
version = "1.3.2"
|
|
863
865
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
864
|
-
checksum = "
|
|
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.
|
|
1420
|
+
version = "0.1.18"
|
|
1402
1421
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1403
|
-
checksum = "
|
|
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.
|
|
1694
|
+
version = "1.53.3"
|
|
1676
1695
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1677
|
-
checksum = "
|
|
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.
|
|
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.
|
|
2119
|
+
version = "0.8.63"
|
|
2089
2120
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2090
|
-
checksum = "
|
|
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.
|
|
2128
|
+
version = "0.8.63"
|
|
2098
2129
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2099
|
-
checksum = "
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
|
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-
|
|
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.
|
|
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-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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": "
|
|
51
|
+
"match": "[•系][A-Za-z_∆⍙][A-Za-z0-9_∆⍙]*",
|
|
52
52
|
"name": "support.function.system.bpl"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
|
-
"match": "
|
|
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=""/>
|
|
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=""/>
|
|
1340
1340
|
<key code="16" output=""/>
|
|
1341
1341
|
<key code="17" output=""/>
|
|
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"/>
|