¿Cómo se crean las variables en secuencia en Lisp común?
-
27-09-2019 - |
Pregunta
Tengo el siguiente código dentro de una función que está leyendo en un archivo que es un mapa. Me aparece un error que *numrows*
es una dimensión ilegal. Creo que esto se debe a que Lisp está procesando estas variables en paralelo. ¿Cómo puedo solucionar este problema?
(setq *numrows* (read map))
(setq *numcols* (read map))
(setq *map* (make-array '(*numrows* *numcols*) :initial-element nil))
Solución
Usted está mal diagnóstico del problema. El primer argumento que está pasando para hacer-matriz es una lista de dos símbolos, * * y * numRows númeroColumnas *. Sin embargo, el primer argumento para hacer-matriz debe ser una lista de números enteros no negativos. La forma más fácil de reparar su ejemplo es hacer una lista con los valores de en lugar de: (aún númeroFilas * * * * númeroColumnas). Así que el código sería el siguiente lugar:
(setq *numrows* (read map))
(setq *numcols* (read map))
(setq *map* (make-array (list *numrows* *numcols*) :initial-element nil))
normalmente no usar setq así, sin embargo. Probablemente sería mejor, dependiendo del contexto, para unir esas variables con let *:
(let* ((numrows (read map))
(numcols (read map))
(map-array (make-array (list numrows numcols) :initial-element nil))
; do something with map-array
)