Clojure字符串返回值

时间:2011-03-26 20:54:24

标签: clojure lisp

在看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将字符串写入命令行?

2 个答案:

答案 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” 并进行打印