Почему plant1 продолжает быть NIL? - PullRequest
1 голос
/ 22 августа 2010

Пожалуйста, кто-нибудь может объяснить мне, почему "make-array" не влияет на plant1?

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

NIL Ошибка: Попытка сделать операцию массива на NIL, который не является массивом. [тип условия: ОШИБКА ТИПА]

Ответы [ 2 ]

5 голосов
/ 22 августа 2010
(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 имеет тело кода, представляющее собой последовательность форм. У вас есть круглые скобки вокруг последовательности, что неправильно. Прочитайте запись Common Lisp HyperSpec для LET. Упоминается синтаксис.

Использование:

(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 голосов
/ 22 августа 2010

Возьми это с крошкой соли, потому что я в основном имею дело со Схемой, а не с Common Lisp.

Пусть использует следующий синтаксис:

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

Если вы хотите определить только одну переменную ...

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

Из того, что я могу сказать, вы никогда не определяли plant1 в let, плюс синтаксис неправильный, поэтому, как только вы попытаетесь выполнить наборы, он не будет работать. Конечно, я могу быть совершенно неправ, поэтому используйте это только для того, чтобы попробовать, пока кто-то, кто знает, о чем они говорят, не перезвонит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...