Clojure字符串返回值

Clojure字符串返回值,clojure,lisp,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_SOUR

在看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)
Clojure 1.2.0
用户=>“条”
“酒吧”
用户=>(打印“条”)
巴尼尔
用户=>(定义为foo[](“bar”))
#'用户/foo
用户=>(foo)
java.lang.ClassCastException:java.lang.String不能强制转换为clojure.lang.IFn(无源文件:0)
用户=>(打印foo)
#零
用户=>(打印(foo))
java.lang.ClassCastException:java.lang.String不能强制转换为clojure.lang.IFn(无源文件:0)
为什么打印函数不显示字符串“bar”?读者似乎试图将foo的返回值(似乎是字符串)解析为函数? foo应该如何定义print将字符串写入命令行?

因为Clojure试图“解析”任何列表的第一个元素作为函数名 当您在最后一个语句中调用print函数时,将使用一个参数调用它 list(foo),它被解释为对函数foo的调用。到目前为止还不错

但是函数foo返回列表(“bar”),这是不正常的。它被解释为调用“bar”函数,这是不允许的

如果foo是like(defn foo[]“bar”),那么它将工作,因为打印不会接收(“bar”),而只接收“bar”
与其他各种Lisp语言相比,我对Clojure的理解还是有点弱,但这是不对的,不是吗?应该是

(defn foo [] "bar")
否则,您已经定义了一个函数,该函数尝试将字符串
“bar”
作为函数调用,这与您的错误一致

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

嗯,18分钟前有两个正确答案:-)我认为另一个更具描述性,但仍然+1:-)我在项目的根定义cwd方法时遇到了问题。调用
(str-cwd“src/foo.txt”)
将cwd误认为是一级函数对象,返回
“project.core$cwd@63764dsrc/foo.txt“
。将其更改为
(str(cwd)“src/foo.txt”)
可以正常工作。我现在明白了,在命令式语言(Python)中,这是语句
len
和操作
len()
之间的区别。