Clojure 擁有動態語言的全部好處。這意味着你能夠在程序被加載後依然能夠改變它,而且不用採起額外的步驟去編譯代碼。你既不用中止也不用重啓正在運行的應用就可讓修改生效。這對於其餘語言來講但是一個很是顯著的優點,特別是若是你正打算將變化動態地(不用中止和重啓服務器)呈獻給用戶時。 java
要想改變一個已經加載的程序,你惟一須要的是使用REPL去加載變化的地方。REPL是一個獨立的程序,Clojure利用它提供給你和它的編譯器直接交互的功能,固然也能與已經加載的程序進行交互。REPL表明讀取(Read)、求值(Evaluate)、打印(Print)和 循環(Loop)。爲了使用REPL,你只須要使用操做系統提供的命令行來運行它。 shell
打開你的REPL,隨機敲入一些字符。很大概率上Clojure會及時地做出相應一個錯誤。它可不是什麼值都會接受。 express
=>ugh java.lang.Exception: Unable to resolve symbol: ugh in this context..
實際上你會發現Clojure只能對符合語法規則的表達式求值。 服務器
有一點須要記住,全部的表達式都會返回值。即便這個表達式什麼也不作,它也會返回值,哪怕僅僅是一個'nil'(相似java中的null)。 數據結構
=>(do) //先不用管do是作什麼的,其實什麼也不作 nil這是一個很好的特性,由於若是clojure要是什麼都不返回的話,你不知道它是否已經執行完畢仍是陷入了死循環。
咱們以前求值都是針對「表達式」(expression)。咱們爲何不用「代碼」(code)或者「聲明」(statements)來代替「表達式」這個詞呢?一個理由是「表達式」這個詞自己就包含了「代碼"或者」聲明」這兩個概念。拎一個重要的緣由是clojure可不止是隻能對代碼求值。clojure能夠對「數據」(data)求值,這一點與其餘語言不一樣。對clojure來講,代碼即數據。(感受這個例子體現的不是太明顯) oop
數據被求值時僅僅返回自身 this
=>21.42 21.42 =>"a string of characters" "a string of characters"Clojure的數據操做可不單單是字符串或者數字,實際上它支持一套很是豐富的數據類型和數據結構。可是在咱們深刻clojure以前,仍是得先對着門語言多一些瞭解。