basedpl 0.1.78__tar.gz → 0.1.79__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.78 → basedpl-0.1.79}/Cargo.lock +36 -22
- {basedpl-0.1.78 → basedpl-0.1.79}/Cargo.toml +5 -2
- {basedpl-0.1.78 → basedpl-0.1.79}/DEV.md +1 -1
- {basedpl-0.1.78 → basedpl-0.1.79}/PKG-INFO +1 -1
- basedpl-0.1.79/build.rs +58 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/getting-started.ipynb +11 -11
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/regex.ipynb +3 -5
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/repl.qmd +16 -4
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/prefs.qmd +6 -2
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/r.qmd +1 -1
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/bpltests.py +18 -14
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/ipython.py +3 -1
- {basedpl-0.1.78 → basedpl-0.1.79}/src/array/text.rs +26 -14
- {basedpl-0.1.78 → basedpl-0.1.79}/src/array.rs +1 -1
- {basedpl-0.1.78 → basedpl-0.1.79}/src/display.rs +15 -12
- {basedpl-0.1.78 → basedpl-0.1.79}/src/eval/session.rs +22 -7
- {basedpl-0.1.78 → basedpl-0.1.79}/src/fusion.rs +12 -4
- {basedpl-0.1.78 → basedpl-0.1.79}/src/host.rs +11 -5
- {basedpl-0.1.78 → basedpl-0.1.79}/src/host_web.rs +16 -10
- {basedpl-0.1.78 → basedpl-0.1.79}/src/inspection.rs +51 -6
- {basedpl-0.1.78 → basedpl-0.1.79}/src/regex.rs +2 -2
- {basedpl-0.1.78 → basedpl-0.1.79}/src/settings.rs +20 -9
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/explain.rs +9 -4
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/README.md +8 -2
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/aplcart.bpl +1 -1
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/april.bpl +1 -1
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/core.bpl +49 -46
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/lib.bpl +2 -2
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/regex.bpl +4 -4
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference.rs +18 -5
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/settings.rs +12 -3
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_api.py +16 -3
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_ipython.py +1 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_kernel.py +18 -3
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_repl.py +10 -10
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_worker.py +2 -2
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/units.rs +6 -6
- basedpl-0.1.78/build.rs +0 -35
- {basedpl-0.1.78 → basedpl-0.1.79}/.cargo/config.toml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/.gitattributes +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/.github/workflows/ci.yml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/.github/workflows/docs.yml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/.github/workflows/speed.yml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/.github/workflows/test.yml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/.gitignore +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/.node-version +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/CONTRIBUTING.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/LICENSE +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/README.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/_config.yml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/_layouts/default.html +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/jetbrains/BPL.tmbundle/Syntaxes/bpl.tmLanguage.json +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/jetbrains/BPL.tmbundle/Syntaxes/hpl.tmLanguage.json +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/jetbrains/BPL.tmbundle/info.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/jetbrains/BPL.xml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/jetbrains/README.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/macos/BasedPL-de.txt +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/macos/BasedPL-es.txt +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/macos/BasedPL-fr.txt +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/macos/BasedPL-uk.txt +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/macos/BasedPL-us.txt +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/vim/ftdetect/bpl.vim +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/vim/syntax/bpl.vim +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/windows/README.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/windows/build.ps1 +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/windows/install.ps1 +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/windows/keyboard.c +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/windows/keyboard.def +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/windows/keyboard.rc +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/editors/windows/layout.h +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/index_files/figure-commonmark/cell-17-output-1.svg +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/index_files/figure-commonmark/cell-18-output-1.svg +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/index_files/figure-html/cell-17-output-1.svg +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/index_files/figure-html/cell-18-output-1.svg +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/lib/LICENSE-april +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/lib/README.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/lib/array.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/lib/dyalog.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/lib/graph.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/lib/numeric.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/lib/power.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/lib/regex.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/lib/string.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/lib/tree.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/.gitignore +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/_quarto.yml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/arrays.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/assignment.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/autodiff.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/bpl.xml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/bqn.xml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/bracket-types.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/cli.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/comparison.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/composition.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/data.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/dfns.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/distributions.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/driver.js +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/dyalog.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/dyalog.xml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/evaluation.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/fonts/BQN386B.woff2 +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/fonts/README.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/fonts/SAX2B.woff2 +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/fonts.css +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery/attractor.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery/boids.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery/dragon.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery/flow.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery/mandelbrot.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery/mandelbrot32.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery/orbits.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery/phyllotaxis.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery/prefs.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery/reaction.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/gallery.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/_metadata.yml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/alpha-underbar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/alpha.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/at.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/backslash-bar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/backslash.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/braces.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/brackets.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/bullet.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/circle-backslash.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/circle-bar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/circle-diaeresis.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/circle-divide.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/circle-slash.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/circle-star.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/circle-stile.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/circle-times.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/circle.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/colon.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/comma-bar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/comma.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/del-diaeresis.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/del-stile.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/del.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/delta-stile.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/diaeresis.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/diamond-underbar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/diamond.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/domino.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/dot.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/down-arrow.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/down-shoe.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/down-tack.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/downstile.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/epsilon-underbar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/epsilon.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/equal-underbar-slash.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/equal-underbar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/equals.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/error-guard.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/exclamation.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/greater-than-or-equal.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/greater-than.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/hash.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/hydrant.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/infinity.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/inverted-question.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/iota-underbar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/iota.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/jot-diaeresis.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/jot.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/lamp.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/left-arrow.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/left-shoe-underbar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/left-shoe.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/left-tack.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/left-tail-arrow.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/less-than-or-equal.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/less-than.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/minus.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/not-equals.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/obelus.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/omega-underbar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/omega.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/overbar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/parentheses.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/partial.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/pi.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/plus.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/quad-colon.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/quad-diamond.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/quad-equal.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/quad-jot.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/quad.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/question.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/quote.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/radical.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/rho.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/right-arrow-from-bar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/right-left-arrows.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/right-shoe.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/right-tack.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/right-tail-arrow.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/slash-bar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/slash.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/squad.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/star-diaeresis.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/star.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/stile-tilde.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/stile.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/superscript-b.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/thorn.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/tilde-diaeresis.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/tilde.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/times.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/tricolon.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/up-arrow.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/up-down-arrow.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/up-shoe.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/up-tack.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/upstile.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/vee-bar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/vee.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/wedge-bar.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/wedge.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs/zilde.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs-study.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/glyphs.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/hanzi-notation-zh.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/hanzi-notation.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/hpl.xml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/index-notation.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/index.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/indexing.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/introspection.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/keyboard.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/keyed.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/llms.txt +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/magics.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/mathish.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/modules.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/nbdev.yml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/notebooks.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/numbers.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/overview.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/papers/aplwiki-arrays.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/papers/brickman-depth-1-scalars.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/papers/mercer-based-system.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/performance.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/playground/bpl.js +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/playground/gallery.js +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/playground/monaco-worker.js +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/playground/page.js +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/playground/worker.js +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/playground.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/plot.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/principles.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/processes.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/puppy.jpg +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/python.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/scripts.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/sidebar.yml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/strings.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/study/01_basics.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/study/02_functions.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/study/03_operators.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/study/04_nested-arrays.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/study/05_searching-indexing.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/study/06_rearranging-arrays.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/study/07_numerical-tools.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/style.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/styles.css +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/syntax.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/_metadata.yml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/c.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/canvas.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/constants.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/copy.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/csv.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/date.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/decompose.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/deflate.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/delay.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/detach.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/distribution.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/edge.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/element.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/ex.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/explain.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/fetch.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/float.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/hash.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/host.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/image.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/index.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/js.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/json.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/literal.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/load.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/memory.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/metadata.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/mime.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/mkdir.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/nc.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/nget.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/nl.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/normalize.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/nput.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/path.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/plot.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/rand.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/readdir.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/remove.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/rename.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/signal.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/src.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/storage.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/svg.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/time.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/ucs.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/uuid.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/vfi.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system/xml.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/system-functions.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/terms.qmd +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/web.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/nbs/xml.ipynb +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/package-lock.json +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/package.json +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/provenance/README.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/provenance/aplcart.jsonl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/provenance/april.jsonl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/provenance/bqn.jsonl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/provenance/core.jsonl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/provenance/dyalog.jsonl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/provenance/ngn.jsonl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/py/Cargo.toml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/py/build.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/py/src/lib.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/pyproject.toml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/__init__.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/_modidx.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/__init__.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/fonts/BQN386B.ttf +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/fonts/LICENSE-BQN386 +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/fonts/LICENSE-SAX2 +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/fonts/SAX2B.ttf +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-de.bundle/Contents/Info.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.icns +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.keylayout +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-de.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-de.bundle/Contents/version.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-es.bundle/Contents/Info.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.icns +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.keylayout +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-es.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-es.bundle/Contents/version.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-fr.bundle/Contents/Info.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.icns +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.keylayout +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-fr.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-fr.bundle/Contents/version.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-uk.bundle/Contents/Info.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.icns +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.keylayout +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-uk.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-uk.bundle/Contents/version.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-us.bundle/Contents/Info.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.icns +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.keylayout +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-us.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/assets/macos/BasedPL-us.bundle/Contents/version.plist +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/bpl.tmLanguage.json +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/dyalog.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/editors.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/font.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/fonts.css +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/functions.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/hpl.tmLanguage.json +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/input.js +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/install.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/keyboards.json +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/keyboards.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/layout.json +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/lb.js +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/notebook_runner.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/notebooks.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/printing.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/reference.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/syntax.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/windows_keyboard.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/python/basedpl/worker.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/rustfmt.toml +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/agreement.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/array/storage.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/batch.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/canvas.js +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/canvas.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/csv.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/data.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/date.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/derivative.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/distribution.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/element.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/error.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/eval/assign.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/eval/binder.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/eval/bindings.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/eval/dissect.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/eval/idioms.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/eval/operators.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/eval/tree.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/eval.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/execution.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/explain.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/files.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/image/codecs.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/image/imageio.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/image.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/jit.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/js.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/json.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/keyed.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/lib.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/linear.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/name.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/number.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/number_theory.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/optimize.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/pervasive.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/plan.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/plot.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/polynomial.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/primitive/indexing.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/primitive/numeric.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/primitive/search.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/primitive/structural.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/primitive.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/program/blocks.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/program/contraction.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/program/layout.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/program/run.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/program/trace.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/program/verify.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/program.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/protocol.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/reference.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/search.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/selection.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/symbols.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/syntax.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/system.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/timing.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/transform.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/src/xml.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/common/mod.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/conftest.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/core.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/derivatives.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/highlighting.mjs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/input.mjs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/instructions.txt +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/jit.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/LICENSE-aplcart +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/LICENSE-april +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/LICENSE-bqn +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/LICENSE-bqncrate +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/LICENSE-dyalog +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/LICENSE-ngn +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/bqn.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/distributions.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/dyalog.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/graphics.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/ngn.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/static-int32.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/static.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/support/april.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/support/avl.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/support/redblack.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/support/sbst.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/reference/support/splay.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/scaling.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/speed/README.md +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/speed/arrays.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/speed/calls.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/speed/images.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/speed/maps.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/speed/models.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/speed/structure.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/speed/tables.bpl +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/speed.rs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_basic.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_bpltests.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_glyphs.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_graphics.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_install.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_instructions.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_keylayout.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_notebooks.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_reference.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/test_windows_keyboard.py +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/wasm-pkg.mjs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/wasm-speed.mjs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/wasm.mjs +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/tests/windows_keyboard.c +0 -0
- {basedpl-0.1.78 → basedpl-0.1.79}/wheel/data/share/jupyter/kernels/bpl/kernel.json +0 -0
|
@@ -99,7 +99,7 @@ checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5"
|
|
|
99
99
|
|
|
100
100
|
[[package]]
|
|
101
101
|
name = "basedpl"
|
|
102
|
-
version = "0.1.
|
|
102
|
+
version = "0.1.79"
|
|
103
103
|
dependencies = [
|
|
104
104
|
"base64 0.23.1",
|
|
105
105
|
"bytemuck",
|
|
@@ -110,6 +110,7 @@ dependencies = [
|
|
|
110
110
|
"cranelift-module",
|
|
111
111
|
"cranelift-native",
|
|
112
112
|
"csv",
|
|
113
|
+
"fancy-regex",
|
|
113
114
|
"flate2",
|
|
114
115
|
"getrandom",
|
|
115
116
|
"globset",
|
|
@@ -127,7 +128,6 @@ dependencies = [
|
|
|
127
128
|
"plotters",
|
|
128
129
|
"png",
|
|
129
130
|
"rand",
|
|
130
|
-
"regex",
|
|
131
131
|
"roxmltree",
|
|
132
132
|
"rustc-demangle",
|
|
133
133
|
"rustix",
|
|
@@ -148,7 +148,7 @@ dependencies = [
|
|
|
148
148
|
|
|
149
149
|
[[package]]
|
|
150
150
|
name = "basedpl-cli"
|
|
151
|
-
version = "0.1.
|
|
151
|
+
version = "0.1.79"
|
|
152
152
|
dependencies = [
|
|
153
153
|
"async-trait",
|
|
154
154
|
"basedpl",
|
|
@@ -162,7 +162,7 @@ dependencies = [
|
|
|
162
162
|
|
|
163
163
|
[[package]]
|
|
164
164
|
name = "basedpl-py"
|
|
165
|
-
version = "0.1.
|
|
165
|
+
version = "0.1.79"
|
|
166
166
|
dependencies = [
|
|
167
167
|
"basedpl",
|
|
168
168
|
"ctrlc",
|
|
@@ -180,7 +180,7 @@ dependencies = [
|
|
|
180
180
|
|
|
181
181
|
[[package]]
|
|
182
182
|
name = "basedpl-wasm"
|
|
183
|
-
version = "0.1.
|
|
183
|
+
version = "0.1.79"
|
|
184
184
|
dependencies = [
|
|
185
185
|
"basedpl",
|
|
186
186
|
"js-sys",
|
|
@@ -189,6 +189,21 @@ dependencies = [
|
|
|
189
189
|
"wasm-bindgen",
|
|
190
190
|
]
|
|
191
191
|
|
|
192
|
+
[[package]]
|
|
193
|
+
name = "bit-set"
|
|
194
|
+
version = "0.8.0"
|
|
195
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
196
|
+
checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
|
|
197
|
+
dependencies = [
|
|
198
|
+
"bit-vec",
|
|
199
|
+
]
|
|
200
|
+
|
|
201
|
+
[[package]]
|
|
202
|
+
name = "bit-vec"
|
|
203
|
+
version = "0.8.0"
|
|
204
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
205
|
+
checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
|
|
206
|
+
|
|
192
207
|
[[package]]
|
|
193
208
|
name = "bitflags"
|
|
194
209
|
version = "1.3.2"
|
|
@@ -712,6 +727,17 @@ version = "0.3.0"
|
|
|
712
727
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
713
728
|
checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
|
|
714
729
|
|
|
730
|
+
[[package]]
|
|
731
|
+
name = "fancy-regex"
|
|
732
|
+
version = "0.20.0"
|
|
733
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
734
|
+
checksum = "20ed7f62ce0ae0da1a8b93c3c7104ab7e0760a74491e097c701fff966e945390"
|
|
735
|
+
dependencies = [
|
|
736
|
+
"bit-set",
|
|
737
|
+
"regex-automata",
|
|
738
|
+
"regex-syntax",
|
|
739
|
+
]
|
|
740
|
+
|
|
715
741
|
[[package]]
|
|
716
742
|
name = "fastrand"
|
|
717
743
|
version = "2.5.0"
|
|
@@ -1071,9 +1097,9 @@ dependencies = [
|
|
|
1071
1097
|
|
|
1072
1098
|
[[package]]
|
|
1073
1099
|
name = "json5"
|
|
1074
|
-
version = "1.3.
|
|
1100
|
+
version = "1.3.6"
|
|
1075
1101
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1076
|
-
checksum = "
|
|
1102
|
+
checksum = "e46128c9fb848c29097da3149e627cce5496d0b2820a9be06d12ee266c09c749"
|
|
1077
1103
|
dependencies = [
|
|
1078
1104
|
"serde",
|
|
1079
1105
|
"ucd-trie",
|
|
@@ -1124,9 +1150,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
|
|
|
1124
1150
|
|
|
1125
1151
|
[[package]]
|
|
1126
1152
|
name = "libz-sys"
|
|
1127
|
-
version = "1.1.
|
|
1153
|
+
version = "1.1.31"
|
|
1128
1154
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1129
|
-
checksum = "
|
|
1155
|
+
checksum = "ff20308ecabd635a2dc1dd5834a86c462cca20efba1d5d3ddab1f8aea3455cb2"
|
|
1130
1156
|
dependencies = [
|
|
1131
1157
|
"cc",
|
|
1132
1158
|
"pkg-config",
|
|
@@ -1582,18 +1608,6 @@ dependencies = [
|
|
|
1582
1608
|
"smallvec",
|
|
1583
1609
|
]
|
|
1584
1610
|
|
|
1585
|
-
[[package]]
|
|
1586
|
-
name = "regex"
|
|
1587
|
-
version = "1.13.1"
|
|
1588
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1589
|
-
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
|
|
1590
|
-
dependencies = [
|
|
1591
|
-
"aho-corasick",
|
|
1592
|
-
"memchr",
|
|
1593
|
-
"regex-automata",
|
|
1594
|
-
"regex-syntax",
|
|
1595
|
-
]
|
|
1596
|
-
|
|
1597
1611
|
[[package]]
|
|
1598
1612
|
name = "regex-automata"
|
|
1599
1613
|
version = "0.4.18"
|
|
@@ -2450,7 +2464,7 @@ checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
|
|
|
2450
2464
|
|
|
2451
2465
|
[[package]]
|
|
2452
2466
|
name = "xtask"
|
|
2453
|
-
version = "0.1.
|
|
2467
|
+
version = "0.1.79"
|
|
2454
2468
|
dependencies = [
|
|
2455
2469
|
"anyhow",
|
|
2456
2470
|
"rustymath",
|
|
@@ -5,7 +5,7 @@ members = ["py"]
|
|
|
5
5
|
join_comments = true
|
|
6
6
|
|
|
7
7
|
[workspace.package]
|
|
8
|
-
version = "0.1.
|
|
8
|
+
version = "0.1.79"
|
|
9
9
|
edition = "2024"
|
|
10
10
|
rust-version = "1.98"
|
|
11
11
|
license = "Apache-2.0"
|
|
@@ -103,7 +103,7 @@ png = ">=0.18.1, <1"
|
|
|
103
103
|
[target.'cfg(not(all(target_arch = "wasm32", target_os = "unknown")))'.dependencies]
|
|
104
104
|
chrono = { version = ">=0.4.45, <0.5", features = ["unstable-locales"] }
|
|
105
105
|
icu_normalizer = ">=2, <3"
|
|
106
|
-
regex = "
|
|
106
|
+
fancy-regex = "0.20"
|
|
107
107
|
walkdir = ">=2.5.0, <3"
|
|
108
108
|
globset = ">=0.4.20, <1"
|
|
109
109
|
# Cranelift compiles a typed program's loops while BPL runs. The browser build has no JIT.
|
|
@@ -126,3 +126,6 @@ wasm-bindgen = ">=0.2.129, <0.3"
|
|
|
126
126
|
[dev-dependencies]
|
|
127
127
|
object = { version = ">=0.39.1, <1", default-features = false, features = ["read"] }
|
|
128
128
|
rustc-demangle = ">=0.1.28, <1"
|
|
129
|
+
|
|
130
|
+
[build-dependencies]
|
|
131
|
+
serde_json = "1"
|
|
@@ -241,7 +241,7 @@ Floats use IEEE NaN, infinity and signed zero. Comparison treats NaN as unequal;
|
|
|
241
241
|
|
|
242
242
|
Under `•prefs ["kinds":"static"]`, a result's kind follows from its arguments' kinds alone, as `meta/kinds.md` describes. `Numeric` carries `kinds` and `int`. Until the `float` pref sets a width, `Numeric::set` gives new floats the width the kinds give, 32 bits under static kinds and 64 under dynamic kinds (`Kinds::float_width`). Whether the pref has set one lives in `settings::float_set`, outside `Numeric`: every call builds and copies a `Numeric`, and a Boolean field there cost about 14 instructions on each primitive call and 34 on each dfn call. A pervasive call on arrays plans before it computes. `plan::pervasive` builds a `plan::Pervasive` from the operands' kinds (`plan::Kind`: type, fixed width and weakness) and the settings, without reading items. It holds the settings with the fixed width that the operands give (`Numeric::for_kinds`), whether 16-bit floats compute in 32 bits, the kind that the call computes in (`computes_in`, which applies rustymath's `DType::common` after `Numeric::kind`), its kernel table (`computes`) and, under static kinds, every result's kind (`Pervasive::result`). Eager dispatch, fusion's deferral (`Pervasive::fuses`) and typed programs read the same plan. Products and folds plan the same way. `plan::Product` holds `g`'s pervasive plan and the settings under which `f` folds its results (`Product::folds`). `plan::Fold` holds a fold's or scan's settings and its operands' kinds. Eager products, folds and scans read them, as typed programs do. Comparisons, `⌈ ⌊` and bitwise functions compute at their arguments' storage width instead, where their results are the same at every width (`pervasive::first_kind`). A comparison between integers and a whole float that stands for an integer computes on integers, through `Pervasive::computes`, as does a residue by such a float or a residue scan from one, whose results then convert to floats (`plan::whole_float`). Literals, values computed only from literals, and Python's scalar arguments are weak (`Number::is_weak`). Before a call, `Primitive::weakened` converts a weak number beside a strong one to the width that rustymath's `DType::common_weak` gives it, or to a fixed integer's width where it fits. The loops keep the failed results that `keeps` names: floats' NaNs, and the wrapped integers of objects that report `WRAPS`. The kernel tables choose float `⌊ ⌈ ×` and wrapping negation from `run.numeric()`. `Stored::build_at` keeps complex results complex. `Primitive::number` gives every pervasive result on numbers, as well as each step of the fold of numbers. Under static kinds, `statically` converts it to the kind that the call's plan gives. A static call on ordinary integers that an integer kernel takes runs that kernel at the `int` width instead, as a call on fixed integers runs it at theirs (`Primitive::integer_kernel`). Under dynamic kinds, a call on two numbers stays outside plans, because the type of its result depends on their values. `Number::wrapped` and `Value::wrapped` wrap an exact integer result to the integer width, the fixed width that `Numeric::for_kinds` finds among a call's operands, or the `int` width under static kinds. Under static kinds a strong ordinary integer is a fixed integer of the width it computes at, the `int` width joined with its storage width (`plan::Kind::stored`). Every static call on integer arrays then computes under a fixed width. Weak integers have no fixed width. NEP 50 decides theirs, as before. Display marks a fixed integer of the `int` width with plain `ₓ` (`Mark::integer`). A fixed kernel that fails where a result doesn't fit, as lcm and binomial coefficients can, gives the exact result wrapped (`Primitive::fixed_number`). `statically` uses them, and so do the functions that compute exactly, such as `⊥`, `⌻` and the determinant. Where integers wrap, a function whose results are approximate, such as `⌹` or polar parts, computes integers as floats of the width that their division gives (`plan::Kind::approximate`). `∂` converts the integers that wrap in its argument to those floats before it runs its function (`derivative::differentiate`). `Number::parse` keeps complex literals and checks integer literals against the `int` width.
|
|
243
243
|
|
|
244
|
-
Settings live once for the whole process, in `settings.rs`, and are read from there, not passed through functions, except where a read is slow and on a hot path. Each setting that calls and scalar operations read is an atomic: the numeric settings, the hanzi aliases, the `batch` pref, the verifier flag, the fusion report flag, fusion's
|
|
244
|
+
Settings live once for the whole process, in `settings.rs`, and are read from there, not passed through functions, except where a read is slow and on a hot path. Each setting that calls and scalar operations read is an atomic: the numeric settings, the hanzi aliases, the `batch` pref, the verifier flag, the fusion report flag, fusion's sizes, which `settings::set_sizes` sets, and the compile setting. The display settings sit behind one lock. `•prefs` writes them, the lexer writes a source's leading `•prefs` header as it reads it, and `settings::reset` restores the defaults, as `]clear` and the test harnesses do. A module that `•load` runs changes the settings for the whole process. Nothing restores them when it returns. Rustymath holds the thread count, the one setting that it reads itself, and `•prefs` writes it there. Each call reads the store once where it starts. Pervasive calls, folds and products read it as they plan (`Primitive::pervasive_mapped`). A dfn call reads it as it looks for its program (`program::call`). So do `Domain::of` and the lexer. Values derived from the settings within a call stay explicit arguments. A call's plan holds the settings it computes under. A pending array computes under the plans that its calls made, whatever settings are in force when it computes. A pending conversion holds the settings that give its floor's tolerance (`Step::Convert`'s `numeric`). A dfn's programs are found by the settings they were traced under (`program::Key`). Under other settings, the dfn traces a new program. The loop structs keep the settings because their closures run on rustymath's worker threads. `Number`'s tolerance methods and `Primitive::number` take them because they run once per item. The parser's leaves take a width marker's width, and `matches_within` takes `⍣∞`'s convergence tolerance. Imports build complex numbers with `Number::complex_in_session`: Python's `_Session.array` and the JSON protocol's `request`. JavaScript values hold no complex numbers.
|
|
245
245
|
|
|
246
246
|
`Numeric::mathish_at(width)` owns Mathish eligibility: the preference must be on, kinds dynamic and the calculation ordinary exact, f64 or complex128. Fixed-integer operations are excluded even when computing at f64. Kernels select their numerical objects before the loop. Mathish comparison tolerance is `1E-14`. f32/f16 compare exactly. Fixed-point convergence uses four ulps at those widths and `1E-14` at f64, independently of Mathish. Index/count/Boolean/character-offset conversion uses `near_integer` with the fixed default tolerance. The numerical objects come from rustymath. Use independent inside/outside-tolerance tests with exact/mixed controls rather than language comparison as its own oracle.
|
|
247
247
|
|
basedpl-0.1.79/build.rs
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
use std::{env, fs, path::Path};
|
|
2
|
+
|
|
3
|
+
fn page_text(path: &Path) -> String {
|
|
4
|
+
let text = fs::read_to_string(path).unwrap();
|
|
5
|
+
if path.extension().is_none_or(|s| s != "ipynb") { return text; }
|
|
6
|
+
let notebook: serde_json::Value = serde_json::from_str(&text).unwrap();
|
|
7
|
+
let language = notebook["metadata"]["kernelspec"]["language"].as_str().unwrap_or("bpl");
|
|
8
|
+
let mut text = String::new();
|
|
9
|
+
for cell in notebook["cells"].as_array().unwrap() {
|
|
10
|
+
let source = match &cell["source"] {
|
|
11
|
+
serde_json::Value::String(s) => s.clone(),
|
|
12
|
+
lines => lines.as_array().unwrap().iter().map(|s| s.as_str().unwrap()).collect(),
|
|
13
|
+
};
|
|
14
|
+
match cell["cell_type"].as_str().unwrap() {
|
|
15
|
+
"markdown" => text.push_str(&source),
|
|
16
|
+
"code" => text.push_str(&format!("```{language}\n{source}\n```")),
|
|
17
|
+
_ => continue,
|
|
18
|
+
}
|
|
19
|
+
text.push_str("\n\n");
|
|
20
|
+
}
|
|
21
|
+
text
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/// Embeds the reference pages and guides, including notebook source but not outputs.
|
|
25
|
+
fn main() {
|
|
26
|
+
println!("cargo::rustc-check-cfg=cfg(web)");
|
|
27
|
+
if env::var("CARGO_CFG_TARGET_ARCH").is_ok_and(|a| a == "wasm32") && env::var("CARGO_CFG_TARGET_OS").is_ok_and(|o| o == "unknown") {
|
|
28
|
+
println!("cargo::rustc-cfg=web");
|
|
29
|
+
}
|
|
30
|
+
let mut entries = Vec::new();
|
|
31
|
+
for dir in ["", "glyphs", "system"] {
|
|
32
|
+
let folder = Path::new("nbs").join(dir);
|
|
33
|
+
println!("cargo::rerun-if-changed={}", folder.display());
|
|
34
|
+
let mut paths: Vec<_> = fs::read_dir(&folder).unwrap().map(|entry| entry.unwrap().path())
|
|
35
|
+
.filter(|path| path.extension().is_some_and(|s| s == "qmd" || s == "ipynb")).collect();
|
|
36
|
+
paths.sort();
|
|
37
|
+
for path in &paths {
|
|
38
|
+
let stem = path.file_stem().unwrap().to_str().unwrap();
|
|
39
|
+
let name = if dir.is_empty() { stem.to_owned() } else { format!("{dir}/{stem}") };
|
|
40
|
+
let mut help = page_text(path);
|
|
41
|
+
if !dir.is_empty() {
|
|
42
|
+
for target in &paths {
|
|
43
|
+
let file = target.file_name().unwrap().to_str().unwrap();
|
|
44
|
+
help = help.replace(&format!("]({file}"), &format!("]({dir}/{file}"));
|
|
45
|
+
}
|
|
46
|
+
help = help.replace("](../", "](");
|
|
47
|
+
}
|
|
48
|
+
let title = help.lines().find_map(|l| l.strip_prefix("# ")).unwrap_or(stem);
|
|
49
|
+
let aliases: Vec<&str> = if dir == "glyphs" { vec![stem] } else if dir == "system" {
|
|
50
|
+
let mut fenced = false;
|
|
51
|
+
help.lines().filter(|line| { fenced ^= line.starts_with("```"); !fenced && line.starts_with('#') })
|
|
52
|
+
.flat_map(|line| line.split('`').skip(1).step_by(2)).filter(|name| name.starts_with(['•', '$'])).collect()
|
|
53
|
+
} else { Vec::new() };
|
|
54
|
+
entries.push(format!("Page {{ name: {name:?}, title: {title:?}, aliases: &{aliases:?}, text: {help:?} }}"));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
fs::write(Path::new(&env::var("OUT_DIR").unwrap()).join("help.rs"), format!("const HELP: &[Page] = &[{}];", entries.join(",\n"))).unwrap();
|
|
58
|
+
}
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"source": [
|
|
33
33
|
"## First calculations\n",
|
|
34
34
|
"\n",
|
|
35
|
-
"Run `bpl` to open the [REPL](repl.qmd). Type an expression and press Enter. `⍝` starts a comment
|
|
35
|
+
"Run `bpl` to open the [REPL](repl.qmd). Type an expression and press Enter. `⍝` starts a comment.\n",
|
|
36
36
|
"\n",
|
|
37
37
|
"BPL evaluates right to left. Parentheses group, and so do spaces. BPL evaluates each part between spaces first."
|
|
38
38
|
]
|
|
@@ -72,9 +72,9 @@
|
|
|
72
72
|
}
|
|
73
73
|
],
|
|
74
74
|
"source": [
|
|
75
|
-
"2×3+4
|
|
76
|
-
"(2×3)+4
|
|
77
|
-
"2×3 + 4
|
|
75
|
+
"2×3+4\n",
|
|
76
|
+
"(2×3)+4\n",
|
|
77
|
+
"2×3 + 4"
|
|
78
78
|
]
|
|
79
79
|
},
|
|
80
80
|
{
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
}
|
|
103
103
|
],
|
|
104
104
|
"source": [
|
|
105
|
-
"10+1 2 3
|
|
105
|
+
"10+1 2 3"
|
|
106
106
|
]
|
|
107
107
|
},
|
|
108
108
|
{
|
|
@@ -139,8 +139,8 @@
|
|
|
139
139
|
}
|
|
140
140
|
],
|
|
141
141
|
"source": [
|
|
142
|
-
"v←⍳5 ⋄ v
|
|
143
|
-
"+/⍳5
|
|
142
|
+
"v←⍳5 ⋄ v\n",
|
|
143
|
+
"+/⍳5"
|
|
144
144
|
]
|
|
145
145
|
},
|
|
146
146
|
{
|
|
@@ -187,8 +187,8 @@
|
|
|
187
187
|
}
|
|
188
188
|
],
|
|
189
189
|
"source": [
|
|
190
|
-
"1÷3
|
|
191
|
-
"1ₓ÷3ₓ
|
|
190
|
+
"1÷3\n",
|
|
191
|
+
"1ₓ÷3ₓ"
|
|
192
192
|
]
|
|
193
193
|
},
|
|
194
194
|
{
|
|
@@ -216,7 +216,7 @@
|
|
|
216
216
|
}
|
|
217
217
|
],
|
|
218
218
|
"source": [
|
|
219
|
-
"1j2×1j¯2
|
|
219
|
+
"1j2×1j¯2"
|
|
220
220
|
]
|
|
221
221
|
},
|
|
222
222
|
{
|
|
@@ -244,7 +244,7 @@
|
|
|
244
244
|
}
|
|
245
245
|
],
|
|
246
246
|
"source": [
|
|
247
|
-
"+/2 3⍴⍳6
|
|
247
|
+
"+/2 3⍴⍳6"
|
|
248
248
|
]
|
|
249
249
|
},
|
|
250
250
|
{
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"\n",
|
|
23
23
|
"`•r pattern` compiles a regular expression. It returns a keyed vector of two functions that share the pattern. `p.matches text` gives a table of the matches, as a record of columns: `text`, the matched text; `position`, its position in characters from 0; and `groups`, the text of each group, which is empty for a group that took no part. `template p.replace text` replaces each match with `template`, expanded with the match's groups.\n",
|
|
24
24
|
"\n",
|
|
25
|
-
"Natively the pattern
|
|
25
|
+
"Natively the pattern uses [fancy-regex's syntax](https://docs.rs/fancy-regex/latest/fancy_regex/#syntax), including lookaround and backreferences. Flags go in the pattern, as in `(?i)`, and templates use `$1`, `${name}` and `$$`. A search that exceeds the engine's backtracking limit raises `DOMAIN`. In the browser the pattern is a JavaScript regular expression, with [JavaScript's syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions), and templates use `$1`, `$<name>` and `$$`. [Regular expressions](regex.ipynb) covers each function.\n",
|
|
26
26
|
"\n",
|
|
27
27
|
"```bpl\n",
|
|
28
28
|
"p←•r \"([a-z]+)([0-9]+)\"\n",
|
|
@@ -33,13 +33,11 @@
|
|
|
33
33
|
"Errors: `DOMAIN` for invalid patterns and non-text arguments; `SYNTAX` for the wrong valence; `LIMIT` for oversized results.\n"
|
|
34
34
|
],
|
|
35
35
|
"text/plain": [
|
|
36
|
-
"function\n",
|
|
37
|
-
"\n",
|
|
38
36
|
"# `•r` — Regular expressions\n",
|
|
39
37
|
"\n",
|
|
40
38
|
"`•r pattern` compiles a regular expression. It returns a keyed vector of two functions that share the pattern. `p.matches text` gives a table of the matches, as a record of columns: `text`, the matched text; `position`, its position in characters from 0; and `groups`, the text of each group, which is empty for a group that took no part. `template p.replace text` replaces each match with `template`, expanded with the match's groups.\n",
|
|
41
39
|
"\n",
|
|
42
|
-
"Natively the pattern
|
|
40
|
+
"Natively the pattern uses [fancy-regex's syntax](https://docs.rs/fancy-regex/latest/fancy_regex/#syntax), including lookaround and backreferences. Flags go in the pattern, as in `(?i)`, and templates use `$1`, `${name}` and `$$`. A search that exceeds the engine's backtracking limit raises `DOMAIN`. In the browser the pattern is a JavaScript regular expression, with [JavaScript's syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions), and templates use `$1`, `$<name>` and `$$`. [Regular expressions](regex.ipynb) covers each function.\n",
|
|
43
41
|
"\n",
|
|
44
42
|
"```bpl\n",
|
|
45
43
|
"p←•r \"([a-z]+)([0-9]+)\"\n",
|
|
@@ -63,7 +61,7 @@
|
|
|
63
61
|
"id": "f6464060",
|
|
64
62
|
"metadata": {},
|
|
65
63
|
"source": [
|
|
66
|
-
"Natively, patterns use [
|
|
64
|
+
"Natively, patterns use [fancy-regex syntax](https://docs.rs/fancy-regex/latest/fancy_regex/#syntax), including lookaround and backreferences. Exceeding the engine's backtracking limit raises `DOMAIN`. In the browser they use [JavaScript's](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions). `p.matches` gives a table of the matches, as a record of columns. Here `p` finds runs of digits:"
|
|
67
65
|
]
|
|
68
66
|
},
|
|
69
67
|
{
|
|
@@ -86,11 +86,26 @@ An unclosed delimiter gives a continuation prompt. Closing it evaluates the comp
|
|
|
86
86
|
|
|
87
87
|
Inside brackets and parentheses, a line break means `⋄`, so each line of a bracket list is a row of the array.
|
|
88
88
|
|
|
89
|
+
## Help
|
|
90
|
+
|
|
91
|
+
`]help` lists the topics available offline. Open a topic by name, as in `]help indexing`, or enter part of its name or title to find matching topics. Names and glyphs work too:
|
|
92
|
+
|
|
93
|
+
| Command | Effect |
|
|
94
|
+
|---|---|
|
|
95
|
+
| `]help indexing` | The indexing guide |
|
|
96
|
+
| `]help +` | Help for a name or glyph |
|
|
97
|
+
| `]help mean -source` | Definition source |
|
|
98
|
+
| `]help llms` | The concise language reference |
|
|
99
|
+
| `]help ?` | Help for the guard glyph |
|
|
100
|
+
| `]help? index(?!ing)` | Regex search over all help text |
|
|
101
|
+
|
|
102
|
+
Everything after `]help?` is the pattern, without quotes. Search ignores case by default. Results put name/title matches before headings, then body text, and show the command to open each topic. Search uses the same platform-specific regex syntax as [`•r`](system/r.qmd). For example, `]help? index|select` finds both terms. Natively, `(?-i)` makes the pattern case-sensitive.
|
|
103
|
+
|
|
89
104
|
## Array and function display
|
|
90
105
|
|
|
91
106
|
Interactive sessions draw arrays in boxes, show functions as trees, and box output made inside functions. [`•prefs`](system/prefs.qmd) reads and changes these settings: `•prefs ["box":$f]` turns boxes off, and `•prefs ⍬` shows every setting. Batch and JSON sessions start without boxes, and so does Python until IPython loads BPL's magics.
|
|
92
107
|
|
|
93
|
-
Matrices
|
|
108
|
+
Matrices and nested arrays have boxes, axis arrows and a type marker on the bottom edge. Other vectors stay plain. Character vectors display as quoted strings, including inside arrays. Their plain form shows their kind, keys and axis name, as in `[2 3 5]ₓ`, `[1.5 2.5]ₛ` and `$t $f`. The marker names the storage: `ₓ` for exact integers, `~` for floats, `j` for complex numbers, `─` for characters, `∊` for nested arrays and `+` for mixed storage, whose items keep their own kinds. Numbers inside an `ₓ` box carry no mark of their own. Without boxes, a matrix whose numbers share a marked kind shows as its literal laid out in rows, with one mark after the brackets. A keyed matrix shows that mark in its corner. Enter a function name to see its tree.
|
|
94
109
|
|
|
95
110
|
An array of more than 1000 items shows only the first and last 3 positions of each long axis. `…` replaces the hidden columns, `⋮` the hidden rows, and `⋱` sits where they cross. The `limit` and `edges` settings of `•prefs` change these numbers. `⎕←` prints every item.
|
|
96
111
|
|
|
@@ -109,9 +124,6 @@ An array of more than 1000 items shows only the first and last 3 positions of ea
|
|
|
109
124
|
|
|
110
125
|
| Command | Effect |
|
|
111
126
|
|---|---|
|
|
112
|
-
| `]help +` | Help for a name or glyph |
|
|
113
|
-
| `]help mean -source` | Definition source |
|
|
114
|
-
| `]help llms` | The index of BPL's documentation for LLMs, [llms.txt](llms.txt) |
|
|
115
127
|
| `]Display [[1 2] [3 4]]` | Draw one array in a box, whatever the settings |
|
|
116
128
|
| `]dissect expression` | Show the bound expression before its result |
|
|
117
129
|
| `]clear` | Remove every name and restore the starting display settings |
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
| Setting | Holds | Default |
|
|
6
6
|
|---|---|---|
|
|
7
|
-
| `box` | `$t` draws matrices
|
|
7
|
+
| `box` | `$t` draws matrices and nested arrays in boxes. Simple vectors and strings stay plain | `$t` in the REPL, the BPL Jupyter kernel and IPython once it loads BPL's magics, `$f` elsewhere |
|
|
8
8
|
| `trees` | `$t` shows functions and dissected expressions as trees; `$f` uses linear notation. Independent of `box` | as `box` |
|
|
9
9
|
| `fns` | `$f` leaves output made inside functions unboxed | as `box` |
|
|
10
10
|
| `dissect` | `$t` shows the bound expression before each normal result, using `trees` | `$f` |
|
|
@@ -23,7 +23,11 @@
|
|
|
23
23
|
| `batch` | `$t` lets each [map](../terms.qmd#term-map) call its operand once on all its cells together, as described below | `$t` |
|
|
24
24
|
| `seed` | A nonnegative whole number that seeds the session's random numbers | A seed from the operating system |
|
|
25
25
|
|
|
26
|
-
Display shows part of an array of more than `limit` items: the first and last `edges` positions of each axis longer than twice `edges`. `…` replaces
|
|
26
|
+
Display shows part of an array of more than `limit` items: the first and last `edges` positions of each axis longer than twice `edges`. `…` replaces hidden columns, `⋮` hidden rows, and `⋱` sits where they cross. A nested array follows the same rule on its own. So does an array that a function holds, such as `⍳10000` in `(⍳10000)↣+`. A line wider than `width` keeps as many positions at each end as fit.
|
|
27
|
+
|
|
28
|
+
Character vectors display as quoted strings, including inside arrays and with `box` on. Embedded quotes are doubled and line breaks stay as line breaks. Other control characters display as escapes such as `\t`. `limit` counts characters in a single-line string and lines in a multiline string. A preview keeps a prefix and up to `edges` trailing characters or lines, with `…` or a `⋮` line between. At least half the budget goes to the prefix. Long lines use the same prefix-and-tail rule to fit `width`.
|
|
29
|
+
|
|
30
|
+
`⎕←` always shows every item and rounds floats to `prec` as display does. [`⍕`](../glyphs/thorn.qmd) and source text always hold every item and every digit. `"-" •nput text` writes raw text without quotes or truncation.
|
|
27
31
|
|
|
28
32
|
`notation` changes generated function and operator displays, including trees and dissected expressions. Dfn source, strings, record keys and field separators stay unchanged. Generated source and structural APIs keep canonical APL spellings.
|
|
29
33
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
`•r pattern` compiles a regular expression. It returns a keyed vector of two functions that share the pattern. `p.matches text` gives a table of the matches, as a record of columns: `text`, the matched text; `position`, its position in characters from 0; and `groups`, the text of each group, which is empty for a group that took no part. `template p.replace text` replaces each match with `template`, expanded with the match's groups.
|
|
4
4
|
|
|
5
|
-
Natively the pattern
|
|
5
|
+
Natively the pattern uses [fancy-regex's syntax](https://docs.rs/fancy-regex/latest/fancy_regex/#syntax), including lookaround and backreferences. Flags go in the pattern, as in `(?i)`, and templates use `$1`, `${name}` and `$$`. A search that exceeds the engine's backtracking limit raises `DOMAIN`. In the browser the pattern is a JavaScript regular expression, with [JavaScript's syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions), and templates use `$1`, `$<name>` and `$$`. [Regular expressions](../regex.ipynb) covers each function.
|
|
6
6
|
|
|
7
7
|
```bpl
|
|
8
8
|
p←•r "([a-z]+)([0-9]+)"
|
|
@@ -374,22 +374,26 @@ def instructions(
|
|
|
374
374
|
runs=3, # Processes at each value of `N`, of which the lowest count is used
|
|
375
375
|
bpl:Annotated[Path, {'nargs':'+'}]=None # A native `bpl` to count, such as a copy saved before a change, or a list of builds to compare, where `None` is the installed one; None: the installed one
|
|
376
376
|
):
|
|
377
|
-
"The instructions that each case retires per unit of `N`, on one thread. A case that doesn't name `N` runs once per step inside `{case ⋄ ⍵}⍣N 0`. That dfn's own call adds about 1,900 instructions per step. For each pair of successive values of `N`, the difference between fresh `bpl` processes, divided by the difference in `N`, cancels startup and `setup`. The result is the median of those slopes. The median drops a one-off cost that starts once `N` passes some size, because such a cost falls between only one pair. Unlike timings, instruction counts don't vary with load or code layout, so they show per-call changes of a few percent. A case that names `N` must make one call per step of `N`, as `⍣` does: a map such as `f¨N⍴0` calls a dfn once on all its cells, so it gives no per-call cost. Given several builds, it gives `ByBuild`, counting each case at the same values of `N` on every build. Each build stays pinned for the whole count (`pinned_each`)."
|
|
377
|
+
"The instructions that each case retires per unit of `N`, on one thread. A case that doesn't name `N` runs once per step inside `{case ⋄ ⍵}⍣N 0`. That dfn's own call adds about 1,900 instructions per step. For each pair of successive values of `N`, the difference between fresh `bpl` processes, divided by the difference in `N`, cancels startup and `setup`. The result is the median of those slopes. The median drops a one-off cost that starts once `N` passes some size, because such a cost falls between only one pair. Unlike timings, instruction counts don't vary with load or code layout, so they show per-call changes of a few percent, and its processes run at once, one for each core. A case that names `N` must make one call per step of `N`, as `⍣` does: a map such as `f¨N⍴0` calls a dfn once on all its cells, so it gives no per-call cost. Given several builds, it gives `ByBuild`, counting each case at the same values of `N` on every build. Each build stays pinned for the whole count (`pinned_each`)."
|
|
378
378
|
cases = listify(cases)
|
|
379
379
|
builds = listify(bpl) or [None]
|
|
380
|
-
|
|
381
|
-
def
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
380
|
+
stepped = [_stepped(case, force) for case in cases]
|
|
381
|
+
def slope(ns, cs): return statistics.median((c1-c0)/(n1-n0) for n0, n1, c0, c1 in zip(ns, ns[1:], cs, cs[1:]))
|
|
382
|
+
with pinned_each(builds) as paths, ThreadPoolExecutor(os.cpu_count()) as pool:
|
|
383
|
+
def lowest(jobs, runs=runs):
|
|
384
|
+
"The lowest count of `runs` processes for each `(code, n, build)` in `jobs`, from processes that run at once."
|
|
385
|
+
got = list(pool.map(lambda job: _retired(_program(job[0], job[1], setup), job[2]), [job for job in jobs for _ in range(runs)]))
|
|
386
|
+
return [min(got[i:i+runs]) for i in range(0, len(got), runs)]
|
|
387
|
+
if counts: ns = [counts]*len(cases)
|
|
388
|
+
else:
|
|
389
|
+
rough = lowest([(code, n, paths[0]) for code in stepped for n in (1_000, 0)])
|
|
390
|
+
# Each value is at least one more than the last, for a case that retires more than `_SPAN` instructions a step, whose warm-up is then a small share of a step.
|
|
391
|
+
ns = [list(accumulate((round((_SETTLE + i*_SPAN)/max(1, (c1-c0)/1_000)) for i in range(4)), lambda last, n: max(n, last + 1)))
|
|
392
|
+
for c1, c0 in zip(rough[::2], rough[1::2])]
|
|
393
|
+
each = []
|
|
394
|
+
for build in paths:
|
|
395
|
+
cs = iter(lowest([(code, n, build) for code, steps in zip(stepped, ns) for n in steps]))
|
|
396
|
+
each.append(Instructions((case, slope(steps, [next(cs) for _ in steps])) for case, steps in zip(cases, ns)))
|
|
393
397
|
return each[0] if len(builds) == 1 else ByBuild(each, builds)
|
|
394
398
|
|
|
395
399
|
class FunctionCounts(list):
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"IPython help and completion for BPL functions and sessions."
|
|
2
2
|
import re
|
|
3
|
+
from html import escape
|
|
3
4
|
from IPython.core.completer import context_matcher, SimpleCompletion
|
|
4
5
|
from . import Function, _Workspace
|
|
5
6
|
|
|
@@ -7,7 +8,8 @@ from . import Function, _Workspace
|
|
|
7
8
|
def inspection_mime(info, detail=False):
|
|
8
9
|
"Render structured BPL inspection as an IPython MIME bundle."
|
|
9
10
|
text = info['source' if detail else 'help']
|
|
10
|
-
return {'text/plain':text, 'text/markdown':f'```apl\n{text}\n```' if detail else text
|
|
11
|
+
return {'text/plain':text, 'text/markdown':f'```apl\n{text}\n```' if detail else text,
|
|
12
|
+
'text/html':f'<pre>{escape(text)}</pre>'}
|
|
11
13
|
|
|
12
14
|
|
|
13
15
|
|
|
@@ -7,6 +7,12 @@ use crate::transform::Plain;
|
|
|
7
7
|
/// Text as a double-quoted string literal.
|
|
8
8
|
pub(crate) fn quoted(text: &str) -> String { format!("\"{}\"", text.replace('"', "\"\"")) }
|
|
9
9
|
|
|
10
|
+
fn excerpt(len: usize, limit: usize, edges: usize) -> impl Iterator<Item = Option<usize>> {
|
|
11
|
+
let tail = edges.min(limit / 2);
|
|
12
|
+
let (head, end) = if len > limit { (limit - tail, len - tail) } else { (len, len) };
|
|
13
|
+
(0..head).map(Some).chain((head < end).then_some(None)).chain((end..len).map(Some))
|
|
14
|
+
}
|
|
15
|
+
|
|
10
16
|
/// Whether `test` holds for a character of source text outside brackets, parentheses, braces and quotes.
|
|
11
17
|
fn outside(text: &str, test: impl Fn(char) -> bool) -> bool {
|
|
12
18
|
let (mut depth, mut chars) = (0, text.chars());
|
|
@@ -159,7 +165,7 @@ impl Value {
|
|
|
159
165
|
Plain::Array(_) => {
|
|
160
166
|
if self.shows_names(el) { return self.named_literal(el); }
|
|
161
167
|
let edges = if self.shape().len() == 1 { el.last(self.shape()) } else { el.edges(self.shape()) };
|
|
162
|
-
if self.string_literal().is_some() { return quoted(&self.elided_text(el)); }
|
|
168
|
+
if self.string_literal(el.display).is_some() { return quoted(&self.elided_text(el)); }
|
|
163
169
|
if let Some(s) = crate::keyed::name(self) {
|
|
164
170
|
return format!(",•ucs {}", s.chars().map(|c| (c as u32).to_string()).collect::<Vec<_>>().join(" "));
|
|
165
171
|
}
|
|
@@ -179,14 +185,20 @@ impl Value {
|
|
|
179
185
|
/// The items display shows of a vector, with `None` for the gap that `edges` leaves.
|
|
180
186
|
fn shown(&self, edges: Option<usize>) -> impl Iterator<Item = Option<Value>> + '_ { positions(self.len(), edges).map(|i| i.map(|i| self.at(i))) }
|
|
181
187
|
|
|
182
|
-
/// A
|
|
188
|
+
/// A string preview, counting multiline text in lines and each shown line in characters.
|
|
183
189
|
pub(crate) fn elided_text(&self, el: Elide) -> String {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
+
let text = crate::keyed::name(self).expect("a character vector");
|
|
191
|
+
let lines: Vec<_> = text.split('\n').collect();
|
|
192
|
+
let multiline = lines.len() > 1;
|
|
193
|
+
let columns = el.columns.min(if multiline { usize::MAX } else { el.limit });
|
|
194
|
+
excerpt(lines.len(), if multiline { el.limit } else { usize::MAX }, el.edges).map(|line| {
|
|
195
|
+
let Some(line) = line else { return "⋮".to_string() };
|
|
196
|
+
let chars: Vec<_> = lines[line].chars().collect();
|
|
197
|
+
excerpt(chars.len(), columns, el.edges).map(|i| match i {
|
|
198
|
+
Some(i) if chars[i].is_control() => chars[i].escape_default().to_string(),
|
|
199
|
+
Some(i) => chars[i].to_string(), None => "…".to_string(),
|
|
200
|
+
}).collect::<String>()
|
|
201
|
+
}).collect::<Vec<_>>().join("\n")
|
|
190
202
|
}
|
|
191
203
|
|
|
192
204
|
/// Text for each shown item of a vector, written by `item`, with `…` for the gap that `edges` leaves.
|
|
@@ -263,9 +275,9 @@ impl Value {
|
|
|
263
275
|
/// Whether plain display shows the vector as a strand: a vector of two or more numbers, characters or strings. Exact integers show in brackets instead.
|
|
264
276
|
pub(crate) fn is_strand(&self, el: Elide) -> bool {
|
|
265
277
|
matches!(self, Self::Array(_)) && self.shape().len() == 1 && self.len() >= 2 && !self.has_keys() && !self.shows_names(el)
|
|
266
|
-
&& self.string_literal().is_none() && !matches!(self.shown_kind(), Some((rustymath::buffer::DType::Integer(_), _))) && match self.as_items() {
|
|
278
|
+
&& self.string_literal(el.display).is_none() && !matches!(self.shown_kind(), Some((rustymath::buffer::DType::Integer(_), _))) && match self.as_items() {
|
|
267
279
|
Items::Values(items) => {
|
|
268
|
-
items.iter().all(|e| matches!(e, Self::Number(_)) || matches!(e, Self::Character(c) if !c.is_control()) || e.string_literal().is_some())
|
|
280
|
+
items.iter().all(|e| matches!(e, Self::Number(_)) || matches!(e, Self::Character(c) if !c.is_control()) || e.string_literal(el.display).is_some())
|
|
269
281
|
}
|
|
270
282
|
Items::Compact(View::Characters(cs)) => cs.iter().all(|c| !c.is_control()),
|
|
271
283
|
_ => true,
|
|
@@ -315,15 +327,15 @@ impl Value {
|
|
|
315
327
|
|
|
316
328
|
/// A major cell as one part of array notation: a vector's items side by side, a higher rank in its own notation, or one item. A row with one item needs its own brackets, because a single item would be a cell by itself. `edges` elides the whole array's positions.
|
|
317
329
|
fn row(&self, item: fn(&Self, Elide) -> String, el: Elide, edges: Option<usize>) -> String {
|
|
318
|
-
if self.shape().len() == 1 && !self.has_keys() && self.string_literal().is_none() {
|
|
330
|
+
if self.shape().len() == 1 && !self.has_keys() && self.string_literal(el.display).is_none() {
|
|
319
331
|
if self.len() == 1 { return format!("[{}]", item(&self.at(0), el)); }
|
|
320
332
|
self.shown_items(edges, |e| item(&e, el)).join(" ")
|
|
321
333
|
} else if self.shape().len() > 1 && !self.has_keys() { self.block_literal(item, el, edges) }
|
|
322
334
|
else { item(self, el) }
|
|
323
335
|
}
|
|
324
336
|
|
|
325
|
-
/// A character vector
|
|
326
|
-
fn string_literal(&self) -> Option<String> {
|
|
327
|
-
if let Self::Array(_) = self { crate::keyed::name(self).filter(|s| !s.chars().any(|c| c.is_control() && c != '\n')).map(|s| quoted(&s)) } else { None }
|
|
337
|
+
/// A quoted character vector. Source excludes control characters other than a newline.
|
|
338
|
+
fn string_literal(&self, display: bool) -> Option<String> {
|
|
339
|
+
if let Self::Array(_) = self { crate::keyed::name(self).filter(|s| display || !s.chars().any(|c| c.is_control() && c != '\n')).map(|s| quoted(&s)) } else { None }
|
|
328
340
|
}
|
|
329
341
|
}
|
|
@@ -1001,7 +1001,7 @@ impl Value {
|
|
|
1001
1001
|
}
|
|
1002
1002
|
}
|
|
1003
1003
|
|
|
1004
|
-
impl fmt::Display for Value { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(&crate::display::plain(self, Elide::NONE)) } }
|
|
1004
|
+
impl fmt::Display for Value { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(&crate::display::plain(self, Elide { display: true, ..Elide::NONE })) } }
|
|
1005
1005
|
|
|
1006
1006
|
/// A function value, as display shows it.
|
|
1007
1007
|
impl fmt::Display for crate::Function { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "⟨{}⟩", self.bpl()) } }
|