44 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			44 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: What Is Clojure | |||
|  | localeTitle: 什么是Clojure | |||
|  | --- | |||
|  | ## Clojure是Lisp的一种方言。
 | |||
|  | 
 | |||
|  | Lisps是一个完全独立的C语言系列,如C#,Javascript,Python或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慢很多,但它仍然比Python,Ruby或Javascript快得多。 | |||
|  | ``` | |||
|  |   (.indexOf [1 2 3 4] 2) ;; .indexOf is a Java method!  | |||
|  |   ; => 1  | |||
|  | ``` | |||
|  | 
 | |||
|  | ## Clojure是为并发而设计的。
 | |||
|  | 
 | |||
|  | “并发”在这里意味着“一个程序同时处理多个线程”,这可以使您的代码更快。它还可以使您的代码更加轻松;想象一下,如果两个不同的功能正在改变并同时从同一个对象中读取!这将是彻头彻尾的混乱。值得庆幸的是,在Clojure中,变量是不可变的,这意味着这种混乱不可能破坏。该语言还具有各种功能,可以使并发代码更容易,例如软件事务内存系统,代理和原子。 | |||
|  | 
 | |||
|  | | 上一页| [家](//forum.freecodecamp.com/t/clojure-resources/18422) | [下一个](//forum.freecodecamp.com/t/clojure-the-basics/18410) |   | |||
|  | | | [目录](//forum.freecodecamp.com/t/clojure-resources/18422) | [基础知识](//forum.freecodecamp.com/t/clojure-the-basics/18410) | |