lisp diferença entre (contras 'um (contras' b 'c)) e (contras' a '(B.C.))
Pergunta
Qual é a diferença entre:
(cons 'a (cons 'b 'c)) ;; (A B . C)
e
(cons 'a '(b.c)) ;; (A B.C)
Eu preciso para criar a lista a seguir ((a.b) .c) usando contras, então eu estou tentando entender o que isso "" representa.
L.E :. Eu tenho o seguinte (cons (cons 'a 'b) 'c)
mas produz ((A . B) . C)
e não ((A.B).C)
(Observe os espaços extras)
Solução
Os espaços são usados ??para fichas lista separadas. A.B
é uma única linha de raciocínio. (A.B)
é uma lista com um único elemento. (A . B)
é uma célula contras com A
como carro e B
como cdr.
Uma célula contras é um par de "coisas" (objetos). No seu caso, essas coisas são símbolos, e eles são nomeados A
, B
, etc .. A representação impressa de tal célula é (A . B)
, por exemplo. Isso é chamado de "notação de ponto". O primeiro elemento é chamado de "carro", o segundo "cdr".
A função cons
cria uma tal célula. (cons 'a 'b)
produz, assim, o (A . B)
célula. Nota que os nomes são sempre upcased internamente .
Isso é mais provável que o professor queria, então ((A . B) . C)
é a saída correta, e seu código a resposta certa. Esta é uma célula onde o carro aponta para outra célula, eo cdr contém C
. Essa outra célula é uma célula onde o carro contém A
eo B
cdr.
A propósito, um lista ??em> é uma cadeia linear de tais células contras, de modo que o carro sempre tem um valor e as CDR aponta para o resto da lista. A última cdr aponta nada (que é chamado NIL em Lisp). Na notação de ponto, uma lista é exemplo (A . (B . (C . NIL)))
. Desde listas são importantes, eles podem ser escritos mais curto assim: (A B C)
. Se o último CDR tem um valor em vez de NIL, é mostrado em notação de ponto, por exemplo, (A . (B . (C . D))))
pode ser escrita como (A B C . D)
.
Outras dicas
.
entre dois personagens é uma parte de um símbolo. b.c
é um símbolo com um nome de três personagens:.. b , e c
Se você digitar FOO.BAR
, então Lisp vai lê-lo como um símbolo.
Se você digitar (FOO.BAR)
então Lisp vai lê-lo como uma lista com um símbolo como seu conteúdo.
Se você digitar (FOO . BAR)
então Lisp vai lê-lo como uma célula contras com FOO
como o CAR e BAR
como o CDR .
.
é usado para separar o CAR e CDR de uma célula contras: (a . b)
. Observe o espaço em torno .
.
(cons 'b 'c)
cria uma célula contras com o b
símbolo como o CAR e o símbolo c
como o CDR . É escrito como (b . c)
.
(cons 'a '(b.c))
cria uma lista de dois símbolos, a
e b.c
. É escrito como (a b.c)
.
((A.B).C)
é sempre impresso como ((A.B) . C)
. Também não é uma lista.
((a.b) . c)
é uma célula contras com o (a.b)
lista como o CAR e o símbolo c
como o CDR .
Se isto é no curso de aprendizagem de língua presa, a questão provavelmente não significou uma implícita "no espaço permitido" regra, como espaços não são significativas contra parênteses, e a resposta correta é a que você deu.
Em particular, o espaço após um parêntese de fechamento é sempre adicionado, mas é apenas para leitura humana. Não faz qualquer sentido exigir que não sejam impressas.