2010-08-21 88 views
1

請問有人能解釋爲什麼「make-array」對plant1沒有任何影響嗎?爲什麼plant1保持NIL?

(LET (plant1) ((setq plant1 (make-array '(4 4))) (print plant1) (setf (AREF PLANT1 0 0) 1)))

NIL Error: Attempt to do an array operation on NIL which is not an array. [condition type: TYPE-ERROR]

回答

5
(LET (plant1) ((setq plant1 (make-array '(4 4))) (print plant1) (setf (AREF PLANT1 0 0) 1))) 

第一條規則:格式化您的代碼。

(LET (plant1) 
    ((setq plant1 (make-array '(4 4))) 
    (print plant1) 
    (setf (AREF PLANT1 0 0) 1))) 

括號太多。 let的語法有一個代碼體,它是一系列的形式。你在序列周圍有括號,這是錯誤的。閱讀LET的Common Lisp HyperSpec條目。它提到了語法。

用途:

(LET (plant1) 
    (setq plant1 (make-array '(4 4))) 
    (print plant1) 
    (setf (AREF PLANT1 0 0) 1)) 

這是一樣的:

(LET ((plant1 (make-array '(4 4)))) 
    (print plant1) 
    (setf (AREF PLANT1 0 0) 1)) 
0

帶一粒鹽,因爲我主要是處理Scheme,而不是Common Lisp。

讓我們使用以下語法:

(let ((var1 2) (var2 7)) (+ var1 var2)) 

如果你只是想定義一個變量...

(let ((var1 2)) ...);;Replace ... with whatever operations you do in that scope. 

從我可以告訴,你永遠不會在咱們定義plant1,加語法是錯誤的,所以一旦你嘗試設置,它不起作用。當然,我可能是完全錯誤的,所以只能用這個東西來嘗試,直到有人知道他們正在談論編鐘。