freeCodeCamp/guide/portuguese/clojure/lists-are-everything/index.md

107 lines
5.4 KiB
Markdown
Raw Normal View History

---
title: Clojure Lists They Are Everything
localeTitle: Clojure Lists Eles são tudo
---
As listas são fundamentais para o Clojure. Clojure é um Lisp e Lisps foram originalmente usados para processamento de listas. Tudo em um Lisp é uma lista!
```
(def foo "bar")
```
Esse pedaço de código é na verdade uma lista! Então, é qualquer coisa entre dois colchetes no Clojure. Interessante, não é? Isto é o que torna o Lisps tão interessante - você pode facilmente escrever código que gera um novo código, porque gerar código é tão simples quanto fazer uma lista.
## Fazendo uma lista real
O problema é que, como tudo é uma lista no Clojure, algo assim retornará um erro:
```
(1 2 3 4 5)
; => ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn
```
Que mensagem de erro horrível. O que a REPL está tentando nos dizer é: "1 não é uma função e não pode ser feita em uma." Como tudo em um Lisp é uma lista, o primeiro item de qualquer lista é tratado como uma função, como `def` , `+` ou `str` , portanto, se escrevermos `(1 2 3 4 5)` , ele trata o primeiro elemento ( `1` ) como uma função. função, o que claramente não é.
Podemos resolver isso de duas maneiras. Uma delas é usar a função `list` para construir uma lista, como usar `str` para concatenar strings juntas.
```
(list 1 2 3 4 5)
; => (1 2 3 4 5)
```
Você também pode usar aspas. Citando uma lista essencialmente diz ao compilador que essa lista _não_ é uma chamada de função, e não deve avaliar qualquer código dentro dela.
```
'(1 2 3 4 5)
; => (1 2 3 4 5)
```
Curiosamente, você também pode citar chamadas de função. É assim que as macros funcionam. Eles são bem complexos e merecem seu próprio artigo, então não vamos elaborar aqui.
```
;; Without a ' to quote it, this would return "foobarbaz".
'(str "foo" "bar" "baz")
; => (str "foo" "bar" "baz")
```
![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ":foguete:") [IDEOne isso!](https://ideone.com/6c7UxY)
## Adicionando a uma lista
As listas são projetadas para prepending, em vez de anexar. Não há uma maneira real de anexar a uma lista. Você pode preceder a uma lista usando os `cons` . `conj` também funciona, mas isso é para vetores, e `cons` é mais rápido para listas.
```
(cons 1 '(2 3 4))
; => (1 2 3 4)
```
## Recuperando das listas
Você recupera itens das listas usando `nth` . `get` não funciona em listas, porque as listas são projetadas para acesso sequencial, em vez de acesso aleatório. Note que o `nth` funciona em vetores, mas é mais lento do que o `get` por causa disso.
```
(nth '(1 2 3 4) 0)
; => 1
```
## Convertendo outras coleções em listas
A função de `list` não pode converter outras coleções em listas, porque ele tenta construir uma lista usando os argumentos que ela recebe. Passing `list` a collection retornará uma lista contendo essa coleção.
```
(list [1 2 3 4 5])
; => ([1 2 3 4 5])
```
Para converter em uma lista, use a função `seq` .
```
(seq [1 2 3 4 5])
; => (1 2 3 4 5)
```
## Sequências preguiçosas
O Clojure tem um recurso brilhante chamado "sequências lentas". Uma sequência preguiçosa é uma lista cujos elementos não são gerados até que você se refira a um elemento da sequência mais tarde, avaliando todos os elementos da sequência até o que você deseja. Isso permite que você construa seqüências "infinitas"!
`range` é talvez a sequência mais simples e preguiçosa. Ele contém todos os números.
```
(range 10)
; => (0 1 2 3 4 5 6 7 8 9)
(range -5 5)
; => (-5 -4 -3 -2 -1 0 1 2 3 4)
```
Você pode usar sequências lentas para fazer coisas bem legais, como gerar uma sequência preguiçosa de todos os números de fibonacci.
```
(def fibs
(lazy-cat [0 1] (map + (rest fibs) fibs)))
(take 10 fibs) ;; this means, "evaluate the first 10 fibonacci numbers."
; => (0 1 1 2 3 5 8 13 21 34)
```
Este exemplo é um pouco avançado, e não se deve esperar que você entenda se você é um iniciante. É apenas um exemplo de algo legal que você pode fazer com sequências lentas. Talvez você possa descobrir isso de qualquer maneira!
![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ":foguete:") [IDEOne isso!](https://ideone.com/jwpvt8)
## Quando usar uma lista?
Geralmente, é preferível usar um vetor para usar uma lista, pois não há risco de o compilador avaliar acidentalmente um vetor como uma função e é mais rápido acessar elementos arbitrários de um vetor. As listas são mais úteis em 3 casos:
* Gerando código usando uma macro.
* Gerando sequências lentas "infinitas".
* Prepaçando elementos para uma coleção.
| [![:point_left:](//forum.freecodecamp.com/images/emoji/emoji_one/point_left.png?v=2 ": point_left:") Anterior](//forum.freecodecamp.com/t/clojure-collections/18411) | [![:book:](//forum.freecodecamp.com/images/emoji/emoji_one/book.png?v=2 ":livro:") Casa ![:book:](//forum.freecodecamp.com/images/emoji/emoji_one/book.png?v=2 ":livro:")](//forum.freecodecamp.com/t/clojure-resources/18422) | [Próximo ![:point_right:](//forum.freecodecamp.com/images/emoji/emoji_one/point_right.png?v=2 ": point_right:")](//forum.freecodecamp.com/t/clojure-vectors/18421) |
| [Coleções](//forum.freecodecamp.com/t/clojure-collections/18411) | [Índice](//forum.freecodecamp.com/t/clojure-resources/18422) | [Vetores](//forum.freecodecamp.com/t/clojure-vectors/18421) |