相比 Scheme 與 Common Lisp,Clojure 有哪些坑?
01-14
官方已經給你總結了:
http://clojure.org/lisps(define x #f)
(set! x "(1 2 3))x=&>"(1 2 3)舉一些對新手不是很適應的地方,未必是坑:
- 各種鋪面而來的語法糖讓人略不知所措(如果像我一樣之前只跟著SICP寫寫scheme),可以在標識符前後加好多符號啊,有尖號^ 井號尖號#^ 波浪線~ 波浪線艾特~@ 後綴井號# ......好甜好甜
- Clojure由於jvm-based的原因,正常寫出來的尾遞歸是不會被優化的,只能用recur
- 對於從只弄Java轉過來的,那種(.method Object args)語法會很蛋疼,因為覺得世界都顛倒過來了,不過當用慣了-&>和-&>&>後,會覺得世界稍稍正常一點,調用鏈還在嘛
- 沒有傳統的car cdr
- nil就是空,nil或false在if中都是假值,其他都是真
- 小心binding,有些是sequentially求值的,有些不是;在使用laze-seq的時候,要注意bindings的作用域,不要引入外層的binding
- 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 |