For my multidimensional array library, I'm providing syntactic sugar (_, ^, not
declaring stepping with |) to allow constructs like these to slice the array:
echo foo[1..3, 2..4] echo foo[2.._, 3] echo foo[^2..0|-2, 3] echo foo[^2..0|-2,
_]
>From an array foo
Tensor of shape 5x5 of type "int" on backend "Cpu"
|1 1 1 1 1|
|2 4 8 16 32|
|3 9 27 81 243|
|4 16 64 256 1024|
|5 25 125 625 3125|
Results are
echo foo[1..3, 2..4]
Tensor of shape 3x3 of type "int" on backend "Cpu"
|8 16 32|
|27 81 243|
|64 256 1024|
echo foo[2.._, 3]
Tensor of shape 3x1 of type "int" on backend "Cpu"
81|
256|
625|
echo foo[^2..0|-2, 3]
Tensor of shape 2x1 of type "int" on backend "Cpu"
256|
16|
echo foo[^2..0|-2, _]
Tensor of shape 2x5 of type "int" on backend "Cpu"
|4 16 64 256 1024|
|2 4 8 16 32|
This is working fine, however my macro is a huge spaghetti monster (120 lines)
of if, elif, else with lots of repetition to handle all the cases. Incriminated
code is there:
[https://github.com/mratsim/Arraymancer/blob/Slice-and-Dice/src/arraymancer/accessors_slicer.nim#L187](https://github.com/mratsim/Arraymancer/blob/Slice-and-Dice/src/arraymancer/accessors_slicer.nim#L187)
**What approach can I use to make this easier on the eyes and maintainable?**
There are some nesting levels I could probably do without as I'm calling elif
nnk[1].kind == nnkPrefix: or elif nnk[2].kind == nnkInfix: just to check if I
can then call nnk[1][0] and nnk[2][0]
I'm reading on Finite State Machine, Component-Entity-System,
Chain-of-responsibility pattern, Functional/Declarative DOM/XML tree
manipulation to get some inspirations. But apart from Finite State Machine, the
last 3 seems like very complicated beasts wrt to my "only" 4 deep nesting.
And wrt to FSM, I don't think I can use that in a macro/AST context, can I?