【问题标题】:When you type "hello, world" in Clojure REPL, why does it say 'nil'?当您在 Clojure REPL 中输入“hello, world”时,为什么会显示“nil”?
【发布时间】:2009-09-12 20:30:47
【问题描述】:

我在 Clojure REPL 中输入了这个(使用 enclojure Netbeans 插件):

user=> "hello, world"
"hello, world"
nil

nil 是怎么回事?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    Clojure 中的每个函数或宏调用都会返回一个值,即使是 if 语句或循环结构或顶级函数定义或打印语句,在其他语言中都是“语句”。 Lisps 中没有语句/表达式二分法;一切都是一种表达。

    所以println 和朋友打印到标准输出作为副作用并返回nil,大多数没有任何有用返回的函数也是如此。

    但是在 REPL 中输入文字字符串应该返回字符串本身,就像在 digitalross' 帖子中一样。

    user> (println "hello world")
    hello world
    nil
    user> "hello world"
    "hello world"
    user>
    

    在第一种情况下,hello world 行是 println 打印到标准输出的内容。 nilprintln 的返回值。在第二种情况下,"hello world""hello world" 的返回值,因为字符串的计算结果为自身。在这种情况下,不会将任何内容打印到标准输出。

    (SLIME 和其他一些 REPL 接口将有助于为标准输出(上面的 hello world 行)着色,与您在 REPL 中键入的返回值(上面的 nil)不同,否则可能会造成混淆。 )

    这是您应该在 REPL 中看到的内容。您发布的内容必须是 Enclojure 的工件。

    【讨论】:

    • 非常有帮助。谢谢你。我想知道我的 enclojure 安装是否有问题,或者这是否是,正如你所说,预期的 enclojure 工件。我也想知道如果我继续使用enclojure,我可能会遇到哪些其他“神器”。
    【解决方案2】:

    无法重现...

    在 Clojure 1.0.0 上对我来说不是这样-

    $ java -cp clo*.jar clojure.lang.Repl
    Clojure 1.0.0-
    user=> "hello, world"
    "hello, world"
    user=> 
    

    【讨论】:

      【解决方案3】:

      最近有一些错误与将 CRLF 行尾序列解释为 windows 下的两个不同表达式有关。 clojure 中字符串的返回值应该是字符串本身。

      【讨论】:

        【解决方案4】:

        我认为这是您的表达式的返回值。 ruby 中的 puts 方法就是这种情况。

        【讨论】:

        • 表达式为字符串字面量,返回值为字符串。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 2011-09-12
        • 1970-01-01
        相关资源
        最近更新 更多