1

我是 Clojure 的新手。​<code>(​3​) 和 just 有什么区别3?如果我这样做了,​(3)我会得到这个例外:

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

4

4 回答 4

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)
于 2013-09-01T02:00:40.180 回答
8

在 lisps 括号中表示函数应用程序,因此:

(a b c d)

手段适用a于论点b c d

您正在尝试 apply 3,它不是一个函数,也不能转换为一个函数。

于 2013-08-31T21:06:00.620 回答
6

在 Clojure 中,括号表示函数应用程序(3)正在尝试调用名为 的函数3,该函数不存在。

于 2013-08-31T21:05:35.327 回答
3

当你从 Lisp 开始时,你必须习惯括号是有意义的这一事实。您不能仅仅添加更多括号来消除运算符优先级的歧义——但是,由于所有内容都是前缀形式,因此没有运算符歧义。

一旦您习惯了所有括号都很重要这一事实,请尝试在心理上将开头的一项向右移动,例如(println "hello")变为println("hello")

由于语言非常规则,因此(3)应将其读作3(). 3不是一个函数,因此你不能调用它。

于 2013-09-02T14:57:48.570 回答