Im tratando de acceder a un vector de dimensiones N pero entrar en la recursividad infinita

StackOverflow https://stackoverflow.com/questions/977201

  •  13-09-2019
  •  | 
  •  

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)))
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top