differenza tra Lisp (cons 'bis (cons' b 'c)) e (cons' un '(a.C.))
Domanda
Qual è la differenza tra:
(cons 'a (cons 'b 'c)) ;; (A B . C)
e
(cons 'a '(b.c)) ;; (A B.C)
ho bisogno di creare la seguente lista ((a.b) .c) utilizzando contro in modo sto cercando di capire che cosa "" rappresenta.
L.E :. Ho il seguente (cons (cons 'a 'b) 'c)
ma produce ((A . B) . C)
e non ((A.B).C)
(Nota gli spazi in più)
Soluzione
Gli spazi sono utilizzati per i token lista separata. A.B
è un unico token. (A.B)
è una lista con un unico elemento. (A . B)
è una cella cons con A
come auto e B
come cdr.
Una cella cons è una coppia di "cose" (oggetti). Nel tuo caso, queste cose sono simboli, e prendono il nome A
, B
, ecc .. La rappresentazione stampata di tale cella è (A . B)
, per esempio. Questo si chiama "la notazione punto". Il primo elemento è chiamato "macchina", il secondo "cdr".
La cons
funzione crea una tale cella. (cons 'a 'b)
produce così il (A . B)
cella. Si noti che i nomi sono sempre upcased internamente .
Questo è più probabile che cosa il vostro insegnante voleva, così ((A . B) . C)
è l'uscita corretta, e il codice la risposta giusta. Si tratta di una cella in cui la vettura punta ad un altro cellulare, e il cdr contiene C
. L'altra cellula è una cellula dove la macchina contiene A
e il B
cdr.
Tra l'altro, un è una catena lineare di tali cellule contro, in modo tale che la macchina tiene sempre un valore ed i punti di CDR al resto della lista. I punti la scorsa CDR nulla (che si chiama NIL in Lisp). In notazione del punto, una lista è per esempio (A . (B . (C . NIL)))
. Dal momento che le liste sono importanti, possono essere scritti più breve come questo: (A B C)
. Se l'ultimo CDR ha un valore anziché NIL, viene mostrato in notazione di punto, ad esempio (A . (B . (C . D))))
può essere scritta come (A B C . D)
.
Altri suggerimenti
.
tra i due personaggi è una parte di un simbolo. b.c
è un simbolo con un nome di tre personaggi:.. b , e c
Se si immette FOO.BAR
, poi Lisp lo leggerà come un unico simbolo.
Se si immette (FOO.BAR)
poi Lisp lo leggerà come una lista con un simbolo come il suo contenuto.
Se si immette (FOO . BAR)
poi Lisp lo leggerà come una cellula contro con FOO
come il CAR e BAR
come il CDR .
.
viene utilizzata per separare il CAR e CDR di una cella contro: (a . b)
. Si noti lo spazio intorno .
.
(cons 'b 'c)
crea una cella cons con l'b
simbolo come CAR e il c
simbolo come CDR . È scritto come (b . c)
.
(cons 'a '(b.c))
crea un elenco di due simboli, a
e b.c
. È scritto come (a b.c)
.
((A.B).C)
è sempre stampata come ((A.B) . C)
. Inoltre non è un elenco.
((a.b) . c)
è una cella cons con l'elenco (a.b)
come il CAR e il c
simbolo come CDR .
Se questo è in corso di apprendimento Lisp, la questione probabilmente ha fatto non ha significato un implicito "nessuno spazio consentito" regola, come gli spazi non sono significativi contro la parentesi, e la risposta corretta è quella che hai dato.
In particolare, lo spazio dopo una parentesi di chiusura viene sempre aggiunto, ma è solo a scopo leggibilità umana. Non ha alcun senso di richiedere non da stampare.