Nel tentativo di accedere a una N vettore dimensionale, ma mi trovo in una ricorsione infinita
Domanda
Voglio accedere un vettore n-dimensionale, ma in qualche modo (vuoto? '()) Continua a tornare falso.
;; accesso n dimensionale vettori
;; (Accesso-ND vettore A-list-of-numeri) -> elemento
;; (Accesso-nd (vector (vettore '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)))
prega di aiuto.
Modifica: CORRETTO CODICE
(define (access-nd avector . alist)
(cond
((and (not(empty? alist)) (vector? avector))
(apply access-nd (vector-ref avector (first alist)) (rest alist)))
(else avector)))
Soluzione
Molto probabilmente, che una linea dovrebbe leggere:
(vector-ref (apply access-nd avector (rest alist)) (first alist)))
Senza il "apply", alist
non sarà mai vuoto. Ecco perché:
Nella definizione del access-nd
parametro alist
è una lista parametri opzionali; è separata con un punto da normali parametri posizionali. Ciò significa access-nd
può essere chiamato con parametri 1-n. I parametri successivi al primo sono raccolti per una lista e destinati a alist
. Ad esempio, una chiamata come
(access-nd v 1 2 3)
causerà alist
di essere vincolato alla lista (1 2 3)
. Allo stesso modo, questa chiamata nel codice originale:
(access-nd avector (rest alist))
causerà alist
per essere associato a un elenco con un elemento. Ecco perché alist
non sarà mai vuoto.
apply
del regime, d'altra parte, prende una lista di argomenti come l'ultimo parametro e chiama la funzione come se fossero passati ad esso in modo normale.