CHICKEN Scheme’s included memory representation module

This is a focused look at a single method from CHICKEN Scheme’s included (chicken memory representation) module from the point of view of matrico’s matrix functor module. The particular considered method makes a recursive memory duplicate of its argument:

  • (object-copy any) - Returns a (recursive) copy of the argument.

This copying functionality becomes visibly relevant as soon as a (matrico)-user mutates matrix entries. In matrico only a single user-facing function allows mutation, namely matrix-set! which beomces user-facing as mx-set!. As an example, after a matrix is created, a part is extracted and then an element of the extracted sub-matrix is mutated; this would, without an object-copy in the extracting function, also change the original source matrix from which was extracted, as these are the same objects in memory.

I would have preferred to not have any mutation, but it is sometimes necessary to manipulate single entries, for example in spatial discretization of a partial differential equation, in the method of lines, where specific boundary values need to be manually added to a semi-discretized operator.

As mentioned in the last post, this copying issue affects the functions: matrix-horcat, matrix-vercat, matrix-col, matrix-submatrix, matrix-vec, and matrix-explode, but does not seem to impact performance. However, the non-mutating matrix-set function, a non-mutating variant of matrix-set!, copying a given matrix and returning the copy after changing one entry, also uses object-copy.

In the next post, I progress from the generic matrix functor to the matrix type used practically in matrico.