簡體   English   中英

通用Lisp矢量打印:矢量軸不為零:1

[英]Common Lisp vector printing: Vector axis is not zero: 1

這是我第一次看到此編譯器錯誤,有人知道這是什么嗎? 以及為什么我的函數無法打印我的嵌套向量。

(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*)))))

您正在使用以下代碼創建一個非常特殊的vectors向量:

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

這段代碼將創建一個包含7個元素的向量,每個向量都包含0個元素的向量(即一個空向量)(並且請注意,將初始元素設置為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) ,空向量。

我只需將其循環一次即可打印出矢量。 我仍然不知道那個錯誤是什么,但是從那以后我再也沒有遇到過。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM