optima
optima copied to clipboard
Support matching of multi-dimensional arrays
To supersede cl-match, we need to be able to match arrays of arbitrary dimensions.
e.g. an array of rank 3:
(array 3 (((1 2) (3 4)) ((5 6) (6 8))))
same array using explicit dimensions:
(array (2 2 2) (((1 2) (3 4)) ((5 6) (6 8))))
same array using an array as a pattern:
(array #3(((1 2) (3 4)) ((5 6) (6 8))))
Oh, what about checking the specialized array type? Makes things even worse.
(array 2 double-float ((a b) (c d)))
I have the similar idea.
It would be better if the matcher gives the somewhat similar interface to the constructor.
- all options to make-array except :initial-contents
- e.g.) type declaration should be specified by :element-type. :adjustable, :fill-pointer and so on
and I am thinking about this:
(array (5 5)
((_ _ _ _ _)
___________
a-row
___________
(a _____ b)))
-
a-row
is an displaced array - in order to get the better graphical representation in the source code, symbols made of any number of underscores have the same effect as _
(array (101 101)
((_ (column 99) _)
(column 49)
a
(column 49)
(_ _ _ _ _)))
- ability to specify a numbers of ignored columns, rows.
- should the number accept a execute-time value?
if it doesn't accept an execute-time value, something like 49 might be a choice.
__49__
This is addressed in Trivia, in combination with inline patterns. https://github.com/guicho271828/trivia/blob/master/level2/arrays.lisp