2010-10-03 1 views
2

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

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

Вы проверили, что валы читаются так, как ожидалось? Я не уверен, что вижу, что это проблема, также я не думаю, что именно так обрабатываются переменные. – zellio

ответ

7

Вы неправильно диагностируете проблему. Первый аргумент, который вы передаете MAKE-ARRAY, представляет собой список из двух символов: * NUMROWS * и * NUMCOLS *. Однако первым аргументом MAKE-ARRAY должен быть список неотрицательных целых чисел. Самый простой способ исправить ваш пример - создать список с значениями вместо: (список * 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 
) 
+0

Спасибо! Это сделал трюк !!! –