我是 Clojure 的新手。<code>(3) 和 just 有什么区别3
?如果我这样做了,(3)
我会得到这个例外:
java.lang.ClassCastException: java.lang.Long 无法转换为 clojure.lang.IFn。
我是 Clojure 的新手。<code>(3) 和 just 有什么区别3
?如果我这样做了,(3)
我会得到这个例外:
java.lang.ClassCastException: java.lang.Long 无法转换为 clojure.lang.IFn。
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)
在 lisps 括号中表示函数应用程序,因此:
(a b c d)
手段适用a
于论点b c d
您正在尝试 apply 3
,它不是一个函数,也不能转换为一个函数。
在 Clojure 中,括号表示函数应用程序。(3)
正在尝试调用名为 的函数3
,该函数不存在。
当你从 Lisp 开始时,你必须习惯括号是有意义的这一事实。您不能仅仅添加更多括号来消除运算符优先级的歧义——但是,由于所有内容都是前缀形式,因此没有运算符歧义。
一旦您习惯了所有括号都很重要这一事实,请尝试在心理上将开头的一项向右移动,例如(println "hello")
变为println("hello")
。
由于语言非常规则,因此(3)
应将其读作3()
. 3
不是一个函数,因此你不能调用它。