Im tratando de acceder a un vector de dimensiones N pero entrar en la recursividad infinita
Pregunta
Quiero tener acceso a un vector n-dimensional pero de alguna manera (vacío? '()) Sigue reapareciendo falsa.
;; de acceso n dimensionales vectores
;; (Acceso-nd vector de una lista-de-números) -> elemento
;; (Acceso-nd (vector (vector 'x' y) 'a' b)) 0 1) -> x
(define (access-nd avector . alist)
(cond
((and (not(empty? alist)) (vector? avector))
(vector-ref (access-nd avector (rest alist)) (first alist)))
(else avector)))
Por favor, ayuda.
Editar: CORREGIDO CÓDIGO
(define (access-nd avector . alist)
(cond
((and (not(empty? alist)) (vector? avector))
(apply access-nd (vector-ref avector (first alist)) (rest alist)))
(else avector)))
Solución
Lo más probable es que una línea debe decir:
(vector-ref (apply access-nd avector (rest alist)) (first alist)))
Sin el "aplicar", alist
nunca será vacía. He aquí por qué:
En la definición de access-nd
el parámetro alist
es una lista de parámetros opcionales; se separa con un punto de parámetros posicionales normales. Esto significa access-nd
puede ser llamado con 1-n parámetros. Cualquier parámetro después de la primera se recogen a una lista y obligados a alist
. Por ejemplo, una llamada como
(access-nd v 1 2 3)
hará que alist
se una a la lista (1 2 3)
. Del mismo modo, este llamado en su código original:
(access-nd avector (rest alist))
hará que alist
en obligarse a una lista con un elemento. Es por eso que alist
nunca estará vacía.
apply
del Esquema, por el contrario, toma una lista de argumentos como el último parámetro y llama a la función como si se pasaron a él de la manera normal.