common lisp contras cria uma lista de dois símbolos, clojure contras requer uma seq aos contras em?
-
13-09-2020 - |
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?
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.
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
.
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.