Common Lisp矢量打印:矢量轴不为零:1

时间:2015-08-08 02:13:00

标签: arrays vector common-lisp sbcl

这是我第一次看到这个编译错误有没有人知道它是什么?以及为什么我的函数无法打印我的嵌套向量。

(defvar *col-lookup* #.(let ((ht (make-hash-table)))
                             (loop for (key . value) in
                                  '(
                                    (A . 0) (B . 1) (C . 2)
                                    (D . 3) (E . 4) (F . 5) (G . 6))  
                                do (setf (gethash key ht) value))
                             ht))

    ;; vector of vectors
    (defparameter *game-board* 
(make-array 7 :initial-element (make-array 0 :initial-element 0)))

    ;;make move lookup character in table then push X onto vector of value of key
    (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*)))))

2 个答案:

答案 0 :(得分:1)

您正在使用代码创建一个非常奇特的向量向量:

(make-array 7 :initial-element (make-array 0 :initial-element 0)))

此代码将创建一个包含7个元素的向量,每个元素都是一个带有0个元素的向量(即空向量)(并注意,将initial元素赋予0是没用的,因为没有要分配的元素)。如果您打印它,您应该看到:

#(#() #() #() #() #() #() #())

这意味着一个带有七个空向量的向量。因此,如果您尝试使用类似(aref (aref *game-board*) 1) 2)的内容向量访问内部向量,则会出现错误。

最后请注意,在函数move的代码中使用:

(push "X" (aref *game-board* place))

其效果不是修改place处的内部向量,而是将(aref *game-board* place)的旧值替换为字符串cons的旧"X"和旧的(aref *game-board* place)#Sat Aug 08 09:36:53 IST 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip ,空矢量。

答案 1 :(得分:0)

我能够通过简单地循环一次来打印我的矢量矢量。我仍然不知道那个错误是什么,但我从未遇到过它。

(defun print-game ()
  (loop for i from 0 to 6 do
       (print (aref *game-board* i))))