Common Lisp - 获取嵌套向量的长度

Common Lisp - get length of nested vector

我有一个数据结构:

*game-board*

#(#() #() #() #() #() #() #())
CL-USER> (test-move)
1
CL-USER> *game-board*
#(("O" "X" . #()) ("O" "X" . #()) ("X" "O" "O" "X" . #())
  ("X" "O" "X" "O" . #()) ("O" "X" . #()) ("X" . #()) ("X" "O" . #()))
CL-USER> (print-game-board)

("O" "X" . #()) 
("O" "X" . #()) 
("X" "O" "O" "X" . #()) 
("X" "O" "X" "O" . #()) 
("O" "X" . #()) 
("X" . #()) 
("X" "O" . #()) 
NIL
CL-USER> 

我的问题是如何获得内部向量的维度?

(array-dimension game-board 0) returns 7为外向量的长度。我怎么不知道如何获得内部向量的维度。

我的代码是这样的:(运行 每个输入一次)

(defun move (c)
  (let ((place (gethash c *col-lookup*)))
    (cond ((oddp *turn-count*)
           (push "X" (aref *game-board* place))
           (incf *turn-count*))
          ((push "O" (aref *game-board* place))
           (incf *turn-count*)))))

我使用矢量是因为我认为我可以将移动推到棋盘上,当检查长度是否小于 4 时,只需跳过该行的水平检查。

我是否在找到解决方案之前就考虑优化?这可能是不明智的,我可能应该按照建议使用二维数组将一些东西组合在一起。

内部数组可能不都具有相同的维度,所以这里有一个给你最大维度的例子:

(defun inner-dimension (outer-array)
  (loop for inner-array being the elements of outer-array
        maximize (array-dimension inner-array 0)))

如果您希望内部数组的大小都相同,您应该使用单个多维数组而不是数组数组。

那是因为你没有内在向量。尽管您从带有 7 个向量的向量开始,但在 (test-move) 之后,您有一个包含 7 个不正确列表的向量,其最后一个元素是 #()。您能否将代码添加到 test-move 以便我们帮助您查看哪里出了问题?

顺便说一句,我猜您在表示网格时使用的是列表表示形式?如果是这样,我建议使用多维数组或仅使用向量和一些辅助函数从一对移动到索引并返回。