Clojure中(3)和3之间的差异

时间:2013-08-31 21:01:31

标签: clojure code-snippets

我是新手。 (​3​)3之间有什么区别?如果我​(3)我得到了这个例外:

java.lang.ClassCastException:java.lang.Long无法强制转换为clojure.lang.IFn。

4 个答案:

答案 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不是函数,因此您无法调用它。