Le espressioni come (set! C (contro 3 c)) sono il modo per aggiungere un elemento a un elenco?

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

  •  12-11-2019
  •  | 
  •  

Domanda

Lo schema ha un set-car! E set-cdr!, ma nessun set-contro! .

Sono espressioni come

(SET! C (CONS 3 C))

Quale colloca l'elemento 3 nell'elenco C, il modo corretto/unico/migliore/normale per modificare un elenco?

È stato utile?

Soluzione

Questo è il modo corretto per modificare l'elenco c. Ma tale utilizzo è raro. Forse potresti dirci di più su ciò che stai cercando di fare.

Altri suggerimenti

(set! c (cons 3 c))

Bene, chiariamo cosa fa questa espressione:

  • set! prende una variabile come il suo primo argomento e un'espressione come secondo argomento. Valuta il secondo argomento e assegna il valore alla variabile.
  • cons Prende un valore e un elenco e produce un elenco con il valore dato come testa e l'elenco indicato come coda.

Così, (set! c (cons 3 c)) costruisce un elenco con 3 come la testa e c come coda e assegna tale elenco come valore di c. Questa modifica è visibile solo al codice che accede alla stessa associazione di c—Se ci sono altre variabili o campi oggetti che si riferiscono all'elenco originale, si riferiscono comunque a quell'elenco originale.

Questo può essere liberamente descritto come "Aggiunta di un elemento a un elenco" in alcuni contesti, ma questa è una descrizione sciolta, perché non stai prendendo un elenco esistente e modificandolo per avere un nuovo elemento; Piuttosto, stai creando un elenco con un nuovo elemento iniziale e l'elenco originale come coda e cambiando alcuni (Ma forse non tutti) riferimenti al vecchio elenco per indicare quello nuovo.

Ci sono due cose principali che posso pensare subito che potrebbero anche contare come "aggiungere un elemento a un elenco":

  • Modifica della struttura di un elenco esistente per aggiungere una nuova coppia da qualche parte nel mezzo o alla fine. Se sei davvero severo riguardo alla terminologia, questo è l'unico vero caso per "aggiungere un elemento a un elenco".
  • Controlli di un elemento alla parte anteriore di un elenco e restituirlo al chiamante o passarlo come argomento a un'altra funzione (senza set!). Questo è anche un linguaggio più sciolto del tuo esempio, ma è anche il caso più comune!

Esempio del primo:

(define (insert-at-second-position! item list)
  (set-cdr! list (cons item (cdr list))))

Esempio del secondo:

(define (list-copy xs)
  (if (null? xs)
      '()
      ;; We call list-copy recursively on the tail, and "add an item"
      ;; at the front:
      (cons (car xs)
            (list-copy (cdr xs)))))

Devi conoscere costruttori di tipi, modificatori e accessori.

Le coppie sono costruite con contro, che è una procedura di 2 argomenti, il primo argomento (l'auto) è il primo elemento della coppia e il secondo argomento (CDR) è il secondo elemento di una coppia. Gli elenchi corretti richiedono che il CDR sia un elenco di terminazione nullo. Altrimenti, è solo una coppia.

I selettori di coppia, (CAR e CDR) prendono un argomento, un elenco costruito e estrae il primo (usando l'auto) o il resto (usando CDR) dell'argomento della coppia IS.

I modificatori (setter) prendono 2 argomenti: un costrutto esistente (una coppia, un'auto di una coppia e praticamente tutto ciò che è stato costruito) e sostituisce il costrutto selezionato con il valore del suo secondo argomento.

(set-car! (cons 'a (cons 'b '())) 'c) ;; is the same as
(set! (car (cons 'a (cons 'b '()))) 'c)

Fatto?

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