为什么plant1保持NIL?

时间:2010-08-21 21:04:50

标签: lisp

拜托,有人可以解释一下为什么“make-array”对plant1没有影响吗?

  

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

     

NIL   错误:尝试在NIL上执行不是数组的数组操作。   [条件类型:TYPE-ERROR]

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

带上一粒盐,因为我主要处理Scheme,而不是Common Lisp。

让我们使用以下语法:

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

如果您只想定义一个变量......

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

据我所知,你从未在let中定义了plant1,加上语法错误,所以一旦你尝试做套装,它就行不通了。当然,我可能完全错了,所以只能用它作为尝试的东西,直到有人知道他们正在谈论的内容。