3.3 KiB
title | localeTitle |
---|---|
What Is Clojure | 什么是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中,变量是不可变的,这意味着这种混乱不可能破坏。该语言还具有各种功能,可以使并发代码更容易,例如软件事务内存系统,代理和原子。