Nel tentativo di accedere a una N vettore dimensionale, ma mi trovo in una ricorsione infinita

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

  •  13-09-2019
  •  | 
  •  

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)))
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top