在看Clojure时只是一个简单的问题......
鉴于以下REPL会话:
Clojure 1.2.0
user=> "bar"
"bar"
user=> (print "bar")
barnil
user=> (defn foo [] ("bar"))
#'user/foo
user=> (foo)
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)
user=> (print foo)
#<user$foo user$foo@65dcc2a3>nil
user=> (print (foo))
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn(NO_SOURCE_FILE:0)
为什么打印功能不显示字符串“bar”?看起来读者试图将foo的返回值(似乎是一个String)解析为函数? 应如何定义print将字符串写入命令行?
答案 0 :(得分:16)
与其他各种Lisp相比,我在Clojure上仍然有点弱,但这不对,是吗?应该是
(defn foo [] "bar")
否则你已经定义了一个函数,它试图将字符串"bar"
作为一个函数调用,这与你的错误一致。
mress:10004 Z$ clj
Clojure 1.2.0
user=> (defn foo [] "bar")
#'user/foo
user=> (foo)
"bar"
答案 1 :(得分:6)
因为Clojure试图将任何列表的第一个元素“解析”为函数名 当你在最后一个名为print function的语句中,它被调用一个参数 list(foo)whish被解释为对函数foo的调用。到目前为止一切顺利。
但函数foo返回列表(“bar”),这不是ok ..它被解释为调用“bar”函数,这是不允许的..
如果foo就像(defn foo []“bar”)而不是它会起作用,因为打印不会接收(“bar”)而只是“bar” 并进行打印