【发布时间】:2009-09-12 20:30:47
【问题描述】:
我在 Clojure REPL 中输入了这个(使用 enclojure Netbeans 插件):
user=> "hello, world"
"hello, world"
nil
nil 是怎么回事?
【问题讨论】:
标签: clojure
我在 Clojure REPL 中输入了这个(使用 enclojure Netbeans 插件):
user=> "hello, world"
"hello, world"
nil
nil 是怎么回事?
【问题讨论】:
标签: clojure
Clojure 中的每个函数或宏调用都会返回一个值,即使是 if 语句或循环结构或顶级函数定义或打印语句,在其他语言中都是“语句”。 Lisps 中没有语句/表达式二分法;一切都是一种表达。
所以println 和朋友打印到标准输出作为副作用并返回nil,大多数没有任何有用返回的函数也是如此。
但是在 REPL 中输入文字字符串应该返回字符串本身,就像在 digitalross' 帖子中一样。
user> (println "hello world")
hello world
nil
user> "hello world"
"hello world"
user>
在第一种情况下,hello world 行是 println 打印到标准输出的内容。 nil 是 println 的返回值。在第二种情况下,"hello world" 是"hello world" 的返回值,因为字符串的计算结果为自身。在这种情况下,不会将任何内容打印到标准输出。
(SLIME 和其他一些 REPL 接口将有助于为标准输出(上面的 hello world 行)着色,与您在 REPL 中键入的返回值(上面的 nil)不同,否则可能会造成混淆。 )
这是您应该在 REPL 中看到的内容。您发布的内容必须是 Enclojure 的工件。
【讨论】:
在 Clojure 1.0.0 上对我来说不是这样-
$ java -cp clo*.jar clojure.lang.Repl
Clojure 1.0.0-
user=> "hello, world"
"hello, world"
user=>
【讨论】:
最近有一些错误与将 CRLF 行尾序列解释为 windows 下的两个不同表达式有关。 clojure 中字符串的返回值应该是字符串本身。
【讨论】:
我认为这是您的表达式的返回值。 ruby 中的 puts 方法就是这种情况。
【讨论】: