2013-08-31 133 views
1

我是新來的clo j ure。 (​3​)3之間的區別是什麼?如果我這樣做​(3)我得到這個異常:Clojure(3)和3之間的區別

java.lang.ClassCastException:java.lang.Long不能轉換爲clojure.lang.IFn。

回答

11
  • 3是文字數3
  • (3)是一個功能的應用程序,你想調用函數3不帶參數。 (有沒有這樣的功能,看起來你不能定義它。)
  • '(3)是一個項目的列表,3。這與(list 3)是一個功能應用程序相同。

這裏是一個REPL會話:

repl=> 3 
3 
repl=> (3) 
ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn repl/eval1388 (NO_SOURCE_FILE:1) 
repl=> '(3) 
(3) 
repl=> (list 3) 
(3) 
repl=> => (defn 3 [] 3) 
ClassCastException java.lang.Long cannot be cast to clojure.lang.IObj clojure.core/with-meta (core.clj:211) 
6

在Clojure中,括號表示函數應用(3)正試圖調用名爲3的函數,該函數不存在。

8

在括號的Lisp意味着功能的應用程序,所以這一點:

(a b c d) 

手段適用於a參數b c d

你想申請3,這是不是一個函數,也可以把它轉換到一個。

+5

如果你想要的是一個3的列表,因爲它只是元素,你需要引用它:''(3)' – soulcheck

3

當你開始口齒不清,你必須習慣這樣的事實:括號是有意義的。你不能只是添加更多的括號來希望消除運營商的優先級 - 但是由於所有內容都是前綴形式,因此不存在運算符含糊不清的情況。一旦你習慣了所有相關問題的事實,試着將開頭的一個項目向右移動,例如, (println "hello")變成println("hello")

由於語言非常規整,所以暗示(3)應該被解讀爲3()3不是一個函數,因此你不能稱之爲它。

+1

+1好的答案,但爲什麼像這樣移動括號是有用的? – fastcodejava

+2

重要的一點是符號的規律性(沒有優先級規則,更容易在宏/元編程中使用)而不是開放paren的位置。在這個時代的開始,父母們不打算留在那裏:http://en.wikipedia.org/wiki/M-expression – cgrand

相關問題