"(1 2 3)舉一些對新手不是很適應的地方,未必是坑:各種鋪面而來的語法糖..." />

相比 Scheme 與 Common Lisp,Clojure 有哪些坑?


官方已經給你總結了:

http://clojure.org/lisps


(define x #f)

(set! x "(1 2 3))

x=&>"(1 2 3)


舉一些對新手不是很適應的地方,未必是坑:

  1. 各種鋪面而來的語法糖讓人略不知所措(如果像我一樣之前只跟著SICP寫寫scheme),可以在標識符前後加好多符號啊,有尖號^ 井號尖號#^ 波浪線~ 波浪線艾特~@ 後綴井號# ......好甜好甜

  2. Clojure由於jvm-based的原因,正常寫出來的尾遞歸是不會被優化的,只能用recur
  3. 對於從只弄Java轉過來的,那種(.method Object args)語法會很蛋疼,因為覺得世界都顛倒過來了,不過當用慣了-&>和-&>&>後,會覺得世界稍稍正常一點,調用鏈還在嘛
  4. 沒有傳統的car cdr
  5. nil就是空,nil或false在if中都是假值,其他都是真
  6. 小心binding,有些是sequentially求值的,有些不是;在使用laze-seq的時候,要注意bindings的作用域,不要引入外層的binding
  7. 2013.12.16 Update, 一個小地方:contains? 是個名不副實的傢伙,不要被欺騙了,比如 (contains? "(100 101 102) 101) 的結果是 false。這個函數原型說明是(contains? coll key),即檢查(coll key)返回是nil/false,還是其他值。想找include意義的函數,請用some.

有個大表比較CommonLisp, Racket(權當代表scheme),Clojure和Emacs Lisp:

Lisp: Common Lisp, Racket, Clojure, Emacs Lisp


- 你想學 Lisp 是嗎, 告訴我你會不會 Java, Maven 會不會? 命令行操作呢?

- ...

- 不會, 那你學個毛

雖然 Clojure 是 Lisp 的方言, 但整個都是在 Java 基礎之上的.

作為不會 Java (只熟悉 JS 生態)當初嘗試去學 Clojure 的, 表示非常難上手,

另外有 ClojureScript 也類似吧, 搭建環境和 JS 調試都非常麻煩.

所以不會 Java 的同學想學 Clojure 千萬小心, 會 Java 的話大膽跳吧


推薦閱讀:

了解和掌握scheme的意義?
scheme中letrec的語義要如何轉化以及實現?
SICP 1.45證明?
怎麼理解從lambda運算元到實際的函數式程序設計語言?

TAG:函數式編程 | Scheme | Clojure | CommonLisp |