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)

Foi útil?

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 é 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top