2011-03-26 90 views
7

只是一个简单的问题,而在寻找的Clojure ....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 [email protected]>nil 
user=> (print (foo)) 
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn(NO_SOURCE_FILE:0) 

为什么不是字符串“bar”通过打印功能显示?看起来读者试图将foo的返回值(它似乎是一个String)作为一个函数来解析? foo应该如何定义打印会将字符串写入命令行?

回答

16

我还是有点Clojure与其他各种Lisp-likes相比,但是这不对,是吗?应该

(defn foo [] "bar") 

否则你定义的尝试拨打字符串"bar"的功能,这与您的错误相一致的功能。

mress:10004 Z$ clj 
Clojure 1.2.0 
user=> (defn foo [] "bar") 
#'user/foo 
user=> (foo) 
"bar" 
+0

我有问题与根定义* CWD *我的方法项目。调用'(str cwd“src/foo.txt”)'错误* cwd *作为第一类函数对象,返回'“[email protected]/foo.txt”'。将其更改为'(str(cwd)“src/foo.txt”)'按预期工作。我现在明白,在命令式语言(Python)中,这是语句'len'和操作'len()'之间的区别。 – Droogans 2013-02-10 18:23:03

6

因为Clojure的尝试“解决”的任何列表的第一个元素作为函数名 当你在最后statment称为打印功能,它用一个参数调用 列表(富)哗哗被解释为调用该函数FOO。到现在为止还挺好。

但未ok..it被解释如呼叫到这是不允许的“杆”功能函数foo返回列表(“条”)..

如果foo是像(DEFN FOO [] “酒吧”)比它会工作,因为打印将不会收到(“酒吧”),但只是“酒吧” 和做印刷

+0

MMH,2个答对18分钟前:-)我认为对方是更describtive了一点,但还是+1 :-) – echox 2011-03-26 21:21:44