For the curious, you can see what I ended up with at my repo here
, along with all of the variable declarations. I was originally trying to see if I could avoid all of the intermediate allocations that happen in the arithmetic functions I wrote. I might write a 5D Slice to compare against the 3D range of 2D slices.
As far as the non-allocating binary operations, never mind. I realized that you'd have to do something like return a new type of Slice object that would retain references to the original pair of ranges, and serve as a node in a computational graph that would recursively evaluate any child nodes on initialization. More complicated than I thought, and I have no idea if it would even have a performance benefit. Anyway, thanks for humoring me.