Arc doesn't really have arrays, so it doesn't have 2-dimensional arrays. One approach is to use a list of lists.
arc> (= plane '((a b c) (d e f) (g h i)))
((a b c) (d e f) (g h i))
arc> ((plane 0) 0)
a
arc> ((plane 0) 1)
b
arc> ((plane 0) 2)
c
arc> ((plane 1) 2)
f
But indexing linked lists is inefficient, so you could similarly nest hash tables.
Granted, neither solution is pretty. I suspect they aren't there because (as with many things) pg hasn't needed them yet himself.
arc> (= x (table))
#hash()
arc> (= (aref x 1 2) 3)
3
arc> x
#hash(((1 2 . nil) . 3))
arc> (x '(1 2))
3
However, strangely, my definition of aref, as:
(def aref (x . indices)
(x indices))
does not work as intended. If x, a table, has a value for the key (list 1 2), then (aref x 1 2) will not find that value. I investigated and, basically, it seems that the list created by (list 1 2) is nil-terminated, while the list constructed from a rest parameter is ()-terminated:
I imagine that's why the hash-table doesn't recognize the 'indices rest parameter as the key (1 2 . nil). Oh well, here's a stupid hack that makes 'aref work properly by constructing an Arc nil-terminated list: