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ù)

È stato utile?

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.

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