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 + 1 file changed, 1 insertion(+) (limited to 'docs/implementation') 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 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

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 (iβŠ‘l) Fn↩ x meaning l ↩ Fn⟜x⌾(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.

-- cgit v1.2.3