【问题标题】:Clojure String Return ValuesClojure 字符串返回值
【发布时间】:2011-03-26 20:54:23
【问题描述】:

在查看 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 (似乎是一个字符串)的返回值解析为一个函数? foo 应该如何定义 print 会将字符串写入命令行?

【问题讨论】:

    标签: clojure lisp


    【解决方案1】:

    与其他各种类似 Lisp 的东西相比,我在 Clojure 方面仍然有点弱,但这不对,是吗?应该是

    (defn foo [] "bar")
    

    否则你定义了一个函数,试图将字符串"bar"作为函数调用,这与你的错误一致。

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

    【讨论】:

    • 我在项目的根目录下定义 cwd 方法时遇到问题。调用(str cwd "src/foo.txt")cwd 误认为是一等函数对象,返回"project.core$cwd@63764dsrc/foo.txt"。将其更改为 (str (cwd) "src/foo.txt") 按预期工作。我现在明白了,在命令式语言 (Python) 中,这就是声明 len 和操作 len() 之间的区别。
    【解决方案2】:

    因为 Clojure 尝试将 any 列表的第一个元素“解析”为函数名 当您在最后一个语句中调用 print 函数时,它使用一个参数调用 list (foo) whish 被解释为对函数 foo 的调用。到目前为止一切顺利。

    但是函数 foo 返回的列表 ("bar") 不正确..它被解释为调用不允许的 "bar" 函数..

    如果 foo 类似于 (defn foo [] "bar") 它将起作用,因为 print 不会接收 ("bar") 而只是 "bar" 并进行打印

    【讨论】:

    • mmh,18 分钟前 2 个正确答案 :-) 我认为另一个更具描述性,但仍然 +1 :-)
    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2012-03-27
    • 1970-01-01
    • 2014-02-14
    相关资源
    最近更新 更多