From fdd35b10d11a1a0fe20634054ee46e2091c44b24 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Fri, 31 Dec 2021 12:45:01 -0500 Subject: Document runtime's SetInv function --- docs/implementation/vm.html | 1 + implementation/vm.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/docs/implementation/vm.html b/docs/implementation/vm.html index 07fd6e95..63fdd9fc 100644 --- a/docs/implementation/vm.html +++ b/docs/implementation/vm.html @@ -712,6 +712,7 @@

To define the final two functions, call the second returned element as a function, with argument DecomposePrimInd. The function PrimInd gives the index of 𝕩 in the list of all primitives (defined as glyphs in pr.bqn), or the length of the runtime if 𝕩 is not a primitive. The two functions are only needed for computing inferred properties, and are defined by default so that every value is assumed to be a primitive, and PrimInd performs a linear search over the returned runtime. If the runtime is used directly, then this means that without setting DecomposePrimInd, function inferred properties will work slowly and for primitives only; if values from the runtime are wrapped then function inferred properties will not work at all. The compiler uses Under with compound right operands, so Decompose is needed to self-host.

+

The compiler returns a third function SetInv as well. This function is used to support inverses of non-primitives like •math.Sin or a block with an Undo header that the runtime has no way to identify. It's not needed for the runtime or compiler. The argument 𝕩 is a function that takes the runtime's current Inverse function ( is defined as {iInverse𝕗𝕨I𝕩}) and returns a new one. If given, 𝕨 does the same to SwapInverse, the function that inverts Fn˜. The result of SetInv is the new Inverse function.

Remember that + and - can also work on characters in some circumstances, under the rules of affine characters. Other arithmetic functions should only accept numbers. = must work on any atoms including functions and modifiers. must work on numbers and characters.

GroupLen and GroupOrd

GroupLen and GroupOrd, short for Group length and Group order, are used to implement Group () and also to grade small-range lists and invert permutations (the inverse of a permutation p is 1¨GroupOrd p). Each of these only needs to work on lists of integers. Shown below are efficient implementations using BQN extended with the notation (il) Fn x meaning l Fnx(i) l, where Fn is if omitted. Since these special assignments only change one element of l, each can be a fast constant-time operation.

diff --git a/implementation/vm.md b/implementation/vm.md index 89f2ef17..e6264e5b 100644 --- a/implementation/vm.md +++ b/implementation/vm.md @@ -212,6 +212,8 @@ The contents of a core runtime are given below. The names given are those used i To define the final two functions, call the second returned element as a function, with argument `Decompose‿PrimInd`. The function `PrimInd` gives the index of `𝕩` in the list of all primitives (defined as `glyphs` in pr.bqn), or the length of the runtime if `𝕩` is not a primitive. The two functions are only needed for computing inferred properties, and are defined by default so that every value is assumed to be a primitive, and `PrimInd` performs a linear search over the returned runtime. If the runtime is used directly, then this means that without setting `Decompose‿PrimInd`, function inferred properties will work slowly and for primitives only; if values from the runtime are wrapped then function inferred properties will not work at all. The compiler uses Under with compound right operands, so `Decompose` is needed to self-host. +The compiler returns a third function `SetInv` as well. This function is used to support inverses of non-primitives like `•math.Sin` or a block with an Undo header that the runtime has no way to identify. It's not needed for the runtime or compiler. The argument `𝕩` is a function that takes the runtime's current `Inverse` function (`⁼` is defined as `{i←Inverse𝕗⋄𝕨I𝕩}`) and returns a new one. If given, `𝕨` does the same to `SwapInverse`, the function that inverts `Fn˜`. The result of `SetInv` is the new `Inverse` function. + Remember that `+` and `-` can also work on characters in some circumstances, under the rules of affine characters. Other arithmetic functions should only accept numbers. `=` must work on any atoms including functions and modifiers. `≤` must work on numbers and characters. ### GroupLen and GroupOrd -- cgit v1.2.3