Clojure 學(xué)習(xí)筆記 :0 零基礎(chǔ)教程

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/


  1. Lisp 黑客精神可以用兩句話來概括:編程應(yīng)該是有趣的捣作。程序應(yīng)該是優(yōu)美的誉结。(摘自ANSI Common Lisp 中文版?

  2. 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)。(想想電影 黑客帝國 中的場景) ?

  3. 也同時(shí)存在運(yùn)行在其它平臺(tái)上的 Clojure 版本赊抖,如 ClojureScript 是一個(gè)可以把 Clojure 代碼編譯成 JavaScript 可執(zhí)行的編譯器专控。Clojure CLR 是一個(gè)運(yùn)行在 DLR 平臺(tái)上的版本 ?

  4. 準(zhǔn)確來說是“圖靈等價(jià)”的。圖靈等價(jià)的詳細(xì)意義請點(diǎn)擊這里查閱。 ?

  5. Java Platform, Micro Edition. 即 Java 精簡版。被設(shè)計(jì)用于小型設(shè)備的 Java 環(huán)境。 ?

  6. 領(lǐng)域特定語言(domain-specific languages奋刽,簡稱DSL)瓦侮,簡單來說就是你可以自己設(shè)計(jì)一套語法,以適應(yīng)你需要處理的問題佣谐。 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肚吏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子狭魂,更是在濱河造成了極大的恐慌罚攀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雌澄,死亡現(xiàn)場離奇詭異斋泄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)镐牺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門炫掐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人睬涧,你說我怎么就攤上這事募胃。” “怎么了宙地?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵摔认,是天一觀的道長逆皮。 經(jīng)常有香客問我宅粥,道長,這世上最難降的妖魔是什么电谣? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任秽梅,我火速辦了婚禮,結(jié)果婚禮上剿牺,老公的妹妹穿的比我還像新娘企垦。我一直安慰自己,他們只是感情好晒来,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布钞诡。 她就那樣靜靜地躺著,像睡著了一般湃崩。 火紅的嫁衣襯著肌膚如雪荧降。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天攒读,我揣著相機(jī)與錄音朵诫,去河邊找鬼。 笑死薄扁,一個(gè)胖子當(dāng)著我的面吹牛剪返,可吹牛的內(nèi)容都是我干的废累。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脱盲,長吁一口氣:“原來是場噩夢啊……” “哼邑滨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钱反,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤驼修,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诈铛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乙各,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年幢竹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耳峦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焕毫,死狀恐怖蹲坷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邑飒,我是刑警寧澤循签,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站疙咸,受9級(jí)特大地震影響县匠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撒轮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一乞旦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧题山,春花似錦兰粉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慨菱,卻和暖如春焰络,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抡柿。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工舔琅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洲劣。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓备蚓,卻偏偏與公主長得像课蔬,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子郊尝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容