Qual è la differenza tra gli elenchi costruiti da quote e quelli costruiti da cons in Scheme?

7
(define ls1 '((1 . 2) 1 . 2))
(set-car! (car ls1) 6)
ls1
(define ls2 (cons '(1 . 2) '(1 . 2)))
(set-car! (car ls2) 6)
ls2

Dopo set-car! ing, ls1 sarà ((6 . 2) 1 . 2) e ls2 ((6 . 2) 6 . 2) . Sembra che ls1 e ls2 abbiano un diverso modello di archiviazione e cosa significa quando qualcuno dice x is bound to a list ? x sta per un starting address o location come quello a è l'indirizzo iniziale di un [10] in C?

    
posta Lucas Li 07.03.2014 - 14:45
fonte

1 risposta

12

Citazione

Quote restituisce i dati che dovresti non modificare e quali possono condividere la struttura tra loro. Per esempio. se hai un file che contiene

(define l1 '(1 2 3))
(define l2 '(4 2 3))

quindi il compilatore può allocare l1 e l2 in modo che condividano la coda comune (cdr l1) e (cdr l2 ) e / o nella memoria di sola lettura.

La modifica di tali elenchi è comportamento indefinito . Fai non fallo.

list

list e cons creano oggetti nuovi (diversi da tutto ciò che esiste già), allocano e popolano la memoria. Ne possiedi - puoi modificarli quanto vuoi.

Il tuo caso

Entrambi le tue set-car! chiamate sono errate - stai modificando i dati di sola lettura e quindi innescando comportamento indefinito (es. fortunato il tuo computer non è esploso in faccia: -).

Specificamente, nel primo caso, ls1 , ottieni ciò che otterresti se facessi la cosa giusta, cioè,

(define ls1
  (cons (cons 1 2)
        (cons 1 2)))

mentre nel secondo caso l'implementazione assegnava solo una cella cons (1 . 2) e la riutilizzava nella creazione di ls2 , cioè, vedi cosa vedresti se valutassi quanto segue ( legale) codice:

(define ls2
  (let ((l (cons 1 2)))
    (cons l l)))

Se ci fossero stampa -circle nello schema , potresti vedere il riutilizzo dei dati:

[1]> (let ((l (cons 1 2)))
        (cons l l)) 
((1 . 2) 1 . 2)
[2]> (setq *print-circle* t)
T
[3]> (let ((l (cons 1 2)))
        (cons l l)) 
(#1=(1 . 2) . #1#)

Binding

x è associato a un valore significa che il nome x si riferisce all'oggetto, allo stesso modo in tutte le lingue.

La differenza in Lisp / Scheme è l'oggetto.

Questa è la prima cella di contro dell'elenco - come probabilmente hai vista molte volte, una (collegata) lista è una catena di cella cons, dove car contiene il valore e cdr contiene la cella cons successiva nell'elenco.

    
risposta data 07.03.2014 - 15:48
fonte

Leggi altre domande sui tag