freeCodeCamp/guide/portuguese/miscellaneous/what-is-clojure/index.md

44 lines
3.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

---
title: What Is Clojure
localeTitle: O que é Clojure
---
## Clojure é um dialeto de Lisp.
Lisps são uma família totalmente separada de linguagens para linguagens semelhantes a C, como C #, Javascript, Python ou Ruby. Isso significa que Lisps pode parecer estranho para os programadores que estão mais familiarizados com esses idiomas. Essencialmente, ser um Lisp significa que tudo no Clojure é uma lista contendo dados (até chamadas de função!), Ele possui digitação dinâmica e você pode definir _macros_ que permitem manipular seu próprio código. Aqui está um exemplo simples de algum Clojure para você examinar:
```
(defn hello-world [] (println "Hello world!"))
```
Isso define uma função (usando a macro `defn` ) chamada `hello-world` que não recebe entrada ( `[]` ) e imprime `"Hello world!"` para o console. Podemos chamá-lo assim:
```
(hello-world)
; => Hello world!
; nil
```
## Clojure é uma linguagem funcional.
Todas as variáveis no Clojure são imutáveis e não podem ser alteradas usando um operador de atribuição ( `=` na maioria das linguagens semelhantes ao C) ou por uma função. Todas as funções pretendem ser _referencialmente transparentes_ , o que significa que, se você fornecer a mesma entrada, elas devem fornecer a mesma saída, não importa o quê. O exemplo do `hello-world` acima é referencialmente transparente - sempre será impresso "Hello world!" não importa o que. Algo que depende de um gerador de números aleatórios não é referencialmente transparente, porque sua saída é aleatória.
```
(defn random-function []
(if (> (rand 4) 2) ; if a random number between 0 and 2 is greater than 2...
(println "foo") ; ...print "foo". otherwise...
(println "bar"))) ; ...print "bar"
```
Apesar de não ser capaz de alterar variáveis pode parecer um pesadelo, é muito mais fácil do que você pensa, especialmente se a linguagem é baseada em torno dele (como o Clojure é!), E evitar mutações desnecessárias pode tornar seu código muito menos problemático.
## O Clojure é executado na Java Virtual Machine.
A JVM é a máquina virtual que interpreta o bytecode Java e a utiliza para executar um programa. Isso significa que o Clojure funciona quase perfeitamente com código projetado para Java (embora pareça um pouco estranho), e também significa que ele é executado muito rapidamente em comparação com alguns outros Lisps. Embora seja um pouco mais lento que o Java, ainda é muito mais rápido que o Python, Ruby ou Javascript.
```
(.indexOf [1 2 3 4] 2) ;; .indexOf is a Java method!
; => 1
```
## O Clojure foi projetado para simultaneidade.
"Concorrência" aqui significa "um programa trabalhando em vários segmentos de uma só vez", o que pode tornar seu código muito mais rápido. Também pode tornar seu código muito mais buggier; imagine se duas funções diferentes estivessem mudando e lendo do mesmo objeto de uma só vez! Seria um caos total. Felizmente, no Clojure, as variáveis são imutáveis, o que significa que não há chance de esse tipo de desordem se soltar. A linguagem também possui uma variedade de recursos para facilitar o código concorrente, como o sistema de memória transacional de software, agentes e átomos.
| ![:point_left:](//forum.freecodecamp.com/images/emoji/emoji_one/point_left.png?v=2 ": point_left:") Anterior | [![: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-the-basics/18410) |
| | [Índice](//forum.freecodecamp.com/t/clojure-resources/18422) | [Noções básicas](//forum.freecodecamp.com/t/clojure-the-basics/18410) |