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

44 lines
3.3 KiB
Markdown
Raw Normal View History

---
title: What Is Clojure
localeTitle: 什么是Clojure
---
## Clojure是Lisp的一种方言。
Lisps是一个完全独立的C语言系列如CJavascriptPython或Ruby。这意味着对于熟悉这些语言的程序员来说Lisps可能看起来很奇怪。本质上作为一个Lisp意味着Clojure中的所有内容都是一个包含数据的列表甚至是函数调用它具有动态类型您可以定义允许您操作自己的代码的_宏_ 。以下是一些Clojure的简单示例供您查看
```
(defn hello-world [] (println "Hello world!"))
```
这定义了一个名为`hello-world`的函数(使用`defn`宏),它不接受任何输入( `[]` )并打印`"Hello world!"`到控制台。我们可以这样称呼它:
```
(hello-world)
; => Hello world!
; nil
```
## Clojure是一种功能语言。
Clojure中所有变量是不可变的并且可以不使用赋值运算符变更`=`在最类似C语言或通过的功能。所有函数的目标都是_引用透明_ ,这意味着如果你给它们相同的输入,它们应该给出相同的输出,无论如何。上面的`hello-world`示例是引用透明的 - 它将始终打印“Hello world”无论。依赖于随机数生成器的东西不是引用透明的因为它的输出是随机的。
```
(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"
```
虽然无法改变变量可能听起来很噩梦但它比你想象的容易得多特别是如果语言基于它比如Clojure就是并且避免不必要的变异会使你的代码变得更少。
## Clojure在Java虚拟机上运行。
JVM是解释Java字节码并使用它来运行程序的虚拟机。这意味着Clojure几乎可以与为Java设计的代码无缝地工作尽管看起来确实有些奇怪这也意味着它与其他一些Lisps相比运行得非常快。虽然它比Java慢很多但它仍然比PythonRuby或Javascript快得多。
```
(.indexOf [1 2 3 4] 2) ;; .indexOf is a Java method!
; => 1
```
## Clojure是为并发而设计的。
“并发”在这里意味着“一个程序同时处理多个线程”,这可以使您的代码更快。它还可以使您的代码更加轻松;想象一下如果两个不同的功能正在改变并同时从同一个对象中读取这将是彻头彻尾的混乱。值得庆幸的是在Clojure中变量是不可变的这意味着这种混乱不可能破坏。该语言还具有各种功能可以使并发代码更容易例如软件事务内存系统代理和原子。
| ![:point_left:](//forum.freecodecamp.com/images/emoji/emoji_one/point_left.png?v=2 "point_left")上一页| [![:book:](//forum.freecodecamp.com/images/emoji/emoji_one/book.png?v=2 ":书:")家![:book:](//forum.freecodecamp.com/images/emoji/emoji_one/book.png?v=2 ":书:")](//forum.freecodecamp.com/t/clojure-resources/18422) | [下一个![:point_right:](//forum.freecodecamp.com/images/emoji/emoji_one/point_right.png?v=2 "point_right")](//forum.freecodecamp.com/t/clojure-the-basics/18410) |
| | [目录](//forum.freecodecamp.com/t/clojure-resources/18422) | [基础知识](//forum.freecodecamp.com/t/clojure-the-basics/18410) |