我是新手。 (3)
和3
之间有什么区别?如果我(3)
我得到了这个例外:
java.lang.ClassCastException:java.lang.Long无法强制转换为clojure.lang.IFn。
答案 0 :(得分: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)
答案 1 :(得分:8)
在lisps括号中表示函数应用,所以这个:
(a b c d)
表示将a
应用于参数b c d
您正在尝试应用3
,这不是函数,也不能转换为函数。
答案 2 :(得分:6)
在Clojure中,括号表示功能应用程序。 (3)
正在尝试调用名为3
的函数,该函数不存在。
答案 3 :(得分:3)
当你从Lisp开始时,你必须习惯括号是有意义的事实。您不能只是添加更多括号以希望消除操作符优先级 - 但是由于所有内容都是前缀形式,因此不存在操作符歧义。
一旦你习惯了所有parenethesis都很重要的事实,试着在心理上将开口的一个项目向右移动,例如(println "hello")
变为println("hello")
。
由于语言非常规则,因此意味着(3)
应该被理解为3()
。 3
不是函数,因此您无法调用它。