2010-10-03 5 views
2

J'ai le code suivant dans une fonction qui lit dans un fichier qui est une carte. J'obtiens une erreur que *numrows* est une dimension illégale. Je pense que c'est parce que Lisp traite ces variables en parallèle. Comment puis-je réparer cela?Comment créer des variables en séquence dans Lisp commun?

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

Avez-vous vérifié que les vals sont lues comme prévu? Je ne suis pas sûr que je vois cela être un problème, aussi je ne pense pas que c'est ainsi que les variables sont traitées. – zellio

Répondre

7

Vous diagnostiez mal le problème. Le premier argument que vous passez à MAKE-ARRAY est une liste de deux symboles, * NUMROWS * et * NUMCOLS *. Cependant, le premier argument de MAKE-ARRAY devrait être une liste d'entiers non négatifs. Le moyen le plus simple de corriger votre exemple est de faire une liste avec les valeurs à la place: (list * numrows * * numcols *). Donc, le code ressemblerait à ceci:

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

Normalement, vous n'utilisez pas setq comme ceci. Il serait probablement mieux, selon le contexte, de lier ces variables avec LET *:

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

Merci! Cela a fait l'affaire !!! –

Questions connexes