Clojure
零基礎(chǔ)
學(xué)習(xí)筆記
A language that doesn't affect the way you think about programming, is not worth knowing. --- Alan J. Perlis
如果一門語言無法對(duì)你的編程思想造成影響往枣,那么它不值得你去了解 --- Alan J. Perlis
本文集使用 WTFPL 協(xié)議
這意味著,歡迎各位隨意的轉(zhuǎn)載置济、修改央星,以及做一切你想要做的事兒识补。這正是我想看到的結(jié)果排截。
但務(wù)必留一個(gè)指向這里的鏈接章鲤,以便讀者獲取到最新的內(nèi)容税产。
(不留的話也無所謂咯)
本人也是一名初學(xué)者怕轿,水平極為有限。
一方面作為學(xué)習(xí)筆記使用辟拷。
另一方面希望能用最易為理解的語言來描述撞羽,讓零編程基礎(chǔ)的同學(xué)也能讀懂。
如有錯(cuò)誤衫冻,歡迎直接在此回復(fù)诀紊、交流、指正隅俘。
我需要你們的反饋渡紫,以提高這個(gè)系列嚴(yán)謹(jǐn)性與可讀性,使之能為更多人提供更好的服務(wù)考赛!
本系列文章的內(nèi)容可能隨時(shí)改動(dòng)惕澎,以優(yōu)化閱讀體驗(yàn),具體改動(dòng)內(nèi)容恕不另行說明颜骤。
也許再讀的時(shí)候會(huì)發(fā)現(xiàn)變化很大了呢唧喉。
如果文中出現(xiàn)了一些非常難以理解的晦澀詞句,在仔細(xì)思考后仍無法理解,那一定是我的表述存在問題八孝。請直接在文章下方留言董朝,我會(huì)詳細(xì)地解釋。再次感謝你的交流與意見干跛。
絮叨
在閱讀本文之前子姜,你可能已經(jīng)學(xué)習(xí)過其它程序設(shè)計(jì)語言
Clojure 也許與你接觸過的語言有很大的不同
無論如何,請忘記它們為什么選擇 Clojure
傳奇語言 Lisp 的一門方言 楼入,簡潔而優(yōu)雅[1]哥捕。
可以方便地與 Java 進(jìn)行交互:
Clojure 運(yùn)行于 JVM[2] 之上[3],這表示你可以直接使用龐大豐富的 Java 庫嘉熊,而 Java 程序也可以反過來調(diào)用 Clojure 代碼遥赚。使得你在 Java 平臺(tái)上投入的精力不被浪費(fèi)。-
Clojure 能做什么
雖然理論上來說阐肤,任何一個(gè)完備的程序設(shè)計(jì)語言凫佛,在功能上都是相等的[4],
也就是說孕惜,A 語言可以做到的事情 B 語言一樣可以做到愧薛。
但是每一種語言是有自己擅長的領(lǐng)域的,
語言的特性決定了其領(lǐng)域衫画。
C / C++ 就比較適合開發(fā)一些對(duì)效率要求很高的東西毫炉。(比如圖形引擎,操作系統(tǒng))
而 Java 則適合用來做后臺(tái)服務(wù)器碧磅。(或者寫一個(gè) Android 程序碘箍,感謝 Android 實(shí)現(xiàn)了 Java ME [5]未竟之事)
Clojure 則借助于 Lisp 得天獨(dú)厚的優(yōu)勢,提供了解決復(fù)雜問題的優(yōu)雅解決途徑:- 使用函數(shù)式編程鲸郊,來大大簡化你的程序丰榴,提高開發(fā)效率。
- 通過宏這種強(qiáng)大的工具秆撮,使得你可以編寫屬于你自己的領(lǐng)域特定語言四濒。(DSL[6])
- 同時(shí)由于她的不可變特性,以及提供了一些處理多線程的操作职辨,在處理并發(fā)時(shí) Clojure 也能顯露優(yōu)勢盗蟆。
我們并不指望你可以一下子感受到語言之間的異同,
但是大概的意思是想讓你明白舒裤,Clojure 作為一門 Lisp 方言喳资,以強(qiáng)大的表達(dá)能力著稱, 使之能以更優(yōu)雅的方式來解決問題腾供。
并不是在貶低其它語言不夠優(yōu)雅仆邓,而是這是事實(shí)鲜滩。(霧)(說完就被打了)
在今后的學(xué)習(xí)中,你會(huì)逐漸感受到這種優(yōu)勢帶給你的便捷节值。 -
為什么 Clojure / Lisp 沒有流行
流行只代表著它的使用者很多徙硅,與它本身的優(yōu)秀與否不存在簡單的關(guān)聯(lián)。流行很大程度上與歷史情況有關(guān)搞疗,在 Lisp 剛剛誕生的時(shí)候嗓蘑,計(jì)算機(jī)的運(yùn)行速度很慢,這導(dǎo)致使用垃圾自動(dòng)回收匿乃、動(dòng)態(tài)特性的 Lisp 的運(yùn)行速度非常緩慢桩皿。
在其之后的誕生的語言 --- 如C,其運(yùn)行速度和其易用性的平衡扳埂,在當(dāng)時(shí)的計(jì)算機(jī)上達(dá) 到了一個(gè)相當(dāng)高的水平业簿,從而成為了一種真正實(shí)用的程序設(shè)計(jì)語言瘤礁。
而流行這種東西類似“滾雪球”阳懂,使用者越滾越多,一旦確立其地位就很難被取代柜思。
原因可能是你的老板認(rèn)為岩调,招收使用人數(shù)較多的程序員更保險(xiǎn)一些,
或者隨大流的使用別人使用的技術(shù)赡盘。Java 的流行則得益于成功的商業(yè)運(yùn)作(以及借用了一大堆 Lisp 系統(tǒng)的技巧和特性号枕,還簡化了 C++ 里一些晦澀的用法),雖然在當(dāng)時(shí) Java 的速度還遠(yuǎn)比不上 C 或者 C++陨享。
隨著計(jì)算機(jī)運(yùn)行速度的提高葱淳,動(dòng)態(tài)語言的執(zhí)行速度已經(jīng)可以接受,
于是一批表達(dá)能力更強(qiáng)的語言誕生了(如Python抛姑,Ruby赞厕,JavaScript),
犧牲了少許在可接受范圍內(nèi)的性能定硝,而得到了更為自然流暢的編程體驗(yàn)皿桑,這些語言自然受到了程序員的歡迎。要知道程序員(可能)是地球上最懶的一群人蔬啡。而 Lisp 無論從思想上诲侮,還是形式上,都是程序語言界的奇葩箱蟆。這導(dǎo)致了程序員在其它設(shè)計(jì)語言上投入的精力沟绪,無法直接幫助他們學(xué)習(xí) Lisp 語言,從而大大的提高了 Lisp 語言的學(xué)習(xí)成本空猜。(好吧绽慈,我承認(rèn)你在其它函數(shù)式語言上的投入也許會(huì)幫助你)
由于剛才我們說過诺核,程序員(可能)是地球上最懶的一群人,所以 Lisp 的流行障礙就非常之大了久信。(但事實(shí)上窖杀,了解 Lisp 思想對(duì)使用其它語言的程序員來說也有益處。)Clojure 作為一門 Lisp 方言裙士,上述討論同樣適用入客。
-
如何部署 Clojure 運(yùn)行環(huán)境
最“傻瓜式”的方式是下載安裝 Eclipse 或者 IDEA 之類的集成開發(fā)環(huán)境
然后再安裝對(duì)應(yīng)的插件
這樣就可以一次性獲得到一整套環(huán)境
Eclipse 插件 Counterclockwise
IDEA 插件 Cursive如果你覺得 IDE 過于笨重,或者現(xiàn)在只是想簡單的體驗(yàn)一把腿椎,不想做復(fù)雜的安裝桌硫,那么你只需下載一個(gè)僅有幾 MB 大小的 jar 包,執(zhí)行一行指令啃炸,便可在命令行使用 Clojure铆隘。
具體做法點(diǎn)擊查看《幾分鐘快速上手運(yùn)行 Clojure》你還可以下載這款 Android 應(yīng)用,無需任何配置南用,僅需下載安裝膀钠,即可隨時(shí)隨地使用手機(jī)來體驗(yàn) Clojure。
點(diǎn)擊這里獲得這個(gè)應(yīng)用在 Google 應(yīng)用商店的地址裹虫。
由于眾所周知的原因我搬運(yùn)了這個(gè)應(yīng)用肿嘲。
http://pan.baidu.com/s/1o7Wh8TG -
如何運(yùn)行 Clojure 程序
【施工中】
Clojure 與 其它 Lisp 方言一樣,提供了一個(gè)稱之為 REPL 的環(huán)境
即 Read-Eval-Print Loop --- “讀取-求值-輸出” 循環(huán)讀戎:讀取一段輸入的代碼
求值:求取這段代碼的值
輸出:顯示出這個(gè)值
循環(huán):繼續(xù)等待下一段代碼的輸入它是一個(gè)交互式的執(zhí)行環(huán)境雳窟,使得你編寫出一段 Clojure 代碼之后,即可立即執(zhí)行它匣屡!
而無需等到全部代碼編寫完畢之后運(yùn)行Clojure 程序是由一句一句的表達(dá)式構(gòu)成的
你可以把一系列表達(dá)式寫在文件里封救,在你需要的時(shí)候一次性執(zhí)行完畢
也可以一句一句的輸入進(jìn) REPL 里執(zhí)行
不用擔(dān)心一句一句解釋執(zhí)行的效率不如一次性執(zhí)行,兩者的執(zhí)行效率是相同的 文檔
你可以訪問 http://clojuredocs.org/ 查閱 API 的小例子
也可以訪問官方網(wǎng)站 http://clojure.github.io/clojure/ 來直接查閱官方 API 說明
英文苦手們可以訪問官方 API 文檔翻譯項(xiàng)目
http://clojure-api-cn.readthedocs.io/en/latest/
-
Lisp 黑客精神可以用兩句話來概括:編程應(yīng)該是有趣的捣作。程序應(yīng)該是優(yōu)美的誉结。(摘自ANSI Common Lisp 中文版) ?
-
Java Virtual Machine,即 Java 虛擬機(jī)虾宇。簡單來說就是運(yùn)行在真實(shí)操作系統(tǒng)上的又一層操作系統(tǒng)搓彻。程序不直接在系統(tǒng)上運(yùn)行,而是在虛擬的系統(tǒng)上運(yùn)行,以此來實(shí)現(xiàn)跨平臺(tái)。(想想電影 黑客帝國 中的場景) ?
-
也同時(shí)存在運(yùn)行在其它平臺(tái)上的 Clojure 版本赊抖,如 ClojureScript 是一個(gè)可以把 Clojure 代碼編譯成 JavaScript 可執(zhí)行的編譯器专控。Clojure CLR 是一個(gè)運(yùn)行在 DLR 平臺(tái)上的版本 ?
-
Java Platform, Micro Edition. 即 Java 精簡版。被設(shè)計(jì)用于小型設(shè)備的 Java 環(huán)境。 ?
-
領(lǐng)域特定語言(domain-specific languages奋刽,簡稱DSL)瓦侮,簡單來說就是你可以自己設(shè)計(jì)一套語法,以適應(yīng)你需要處理的問題佣谐。 ?