common lisp contras cria uma lista de dois símbolos, clojure contras requer uma seq aos contras em?

StackOverflow https://stackoverflow.com/questions/3222789

Pergunta

(Disclaimer - eu estou ciente da importância de Seqs em Clojure)

Em common lisp os contras função pode ser usada para combinar dois símbolos em uma lista:

(def s 'x)
(def l 'y)
(cons s l)

Em clojure - você só pode contras em uma sequência - contras não tenha sido estendido para trabalhar com dois símbolos.Então você tem que escrever:

(def s 'x)
(def l 'y)
(cons s '(l))

Há um alto nível de padrão em Clojure que explica esta diferença entre o Common LISP e Clojure?

Foi útil?

Solução

Em Clojure, ao contrário do tradicional Balbucia, as listas não são os principais estruturas de dados.As estruturas de dados podem implementar o ISeq interface - que é outro modo de exibição de estrutura de dados é dada, permitindo que as mesmas funções para o acesso a elementos em cada um.(Listas já implementar isso. seq? verifica se algo implementa ISeq.(seq? '(1 2)), (seq? [1 2])) Clojure simplesmente age de forma diferente (com razão), em que, quando cons é usado, uma seqüência (é realmente do tipo clojure.lang.Cons construído de a e (seq b) é retornado.(a sendo arg 1 e b arg 2) Obviamente, os símbolos não e não pode implementar ISeq.

Clojure.org/sequences

Sequências de vídeo/palestra Rich Hickey No entanto, observe que rest mudou e o anterior comportamento está agora em next, e que lazy-cons foi substituído por lazy-seq e cons.

clojure.lang.RT

Outras dicas

Em Common Lisp CONTRAS cria uma CONTRAS célula, que é similar a um registro com dois slots:o 'carro' e o 'cdr'.

Você pode colocar QUALQUER coisa para essas duas ranhuras de uma contras célula.

Contras células são usados para construir listas.Mas pode-se criar todos os tipos de estruturas de dados com os contras células:árvores, gráficos, vários tipos de listas especializadas, ...

As implementações de Lisp são altamente otimizadas para proporcionar muito eficaz contras as células.

Um Lisp lista é apenas uma forma comum de usar contras as células (ver Rainer descrição).Clojure é melhor visto como não tendo contras células (embora algo semelhante pode se esconder sob a capa).O Clojure cons é um equívoco, ele realmente deve apenas ser chamado prepend.

Em Clojure o uso de um elemento de dois vetor preferencial: [:a :b].Sob o capô, tais pequenos vetores são implementados como Java matrizes e são extremamente simples e rápido.

Um curto mão para (cons :a '(:b)) (ou (cons :a (cons :b nil))) é list: (list :a :b).

Quando você diz

> (cons 'a 'b)

em common lisp você não tem uma lista, mas uma série de pontos par: (a . b), considerando que o resultado de

> (cons 'a (cons 'b nil))

é pontilhada par (a . ( b . nil)).

Na primeira lista a cdr() de que não é uma lista, uma vez que é aqui b e não nil, tornando-o inadequado lista.Adequada listas devem ser rescindido por nil.Portanto, funções de ordem superior, como mapcar() e amigos não vai funcionar, mas vamos salvar contras-célula.Eu acho que os designers de Clojure removido esse recurso por causa da confusão que isso poderia causar.

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