Как мне создать переменные в последовательности в общем Лиспе? - PullRequest
2 голосов
/ 04 октября 2010

У меня есть следующий код внутри функции, которая читает в файле, который является картой.Я получаю ошибку, что *numrows* является недопустимым измерением.Я думаю, это потому, что lisp обрабатывает эти переменные параллельно.Как я могу это исправить?

(setq *numrows* (read map))
(setq *numcols* (read map))
(setq *map* (make-array '(*numrows* *numcols*) :initial-element nil))

1 Ответ

7 голосов
/ 04 октября 2010

Вы неправильно диагностируете проблему.Первый аргумент, который вы передаете в MAKE-ARRAY, это список из двух символов, * NUMROWS * и * NUMCOLS *.Однако первым аргументом MAKE-ARRAY должен быть список неотрицательных целых чисел.Самый простой способ исправить ваш пример - создать список со значениями : (list * numrows * * numcols *).Таким образом, код будет выглядеть следующим образом:

(setq *numrows* (read map))
(setq *numcols* (read map))
(setq *map* (make-array (list *numrows* *numcols*) :initial-element nil))

Однако обычно вы бы не использовали setq как этот.Вероятно, было бы лучше, в зависимости от контекста, связать эти переменные с помощью LET *:

(let* ((numrows (read map))
       (numcols (read map))
       (map-array (make-array (list numrows numcols) :initial-element nil))
  ; do something with map-array
  )
...