Когда вы набираете "hello, world" в Clojure REPL, почему он говорит "nil"?

Я набрал это в Clojure REPL (с помощью плагина Netbeans):

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

Что за ноль?

Ответ 1

Каждая функция или макровызов возвращает значение в Clojure, даже такие вещи, как выражения if или конструкции циклов, или определения функций уровня или инструкции печати, которые на других языках являются "утверждениями". Там нет дихотомии постановки/выражения в Lisps; все это выражение.

So 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.

Ответ 2

Невозможно воспроизвести...

Это не делает меня для меня на Clojure 1.0.0 -

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

Ответ 3

Есть несколько недавних ошибок, связанных с интерпретацией последовательности строк CRLF в виде двух разных выражений под окнами. Возвращаемое значение строки в clojure должно быть строкой.

Ответ 4

Я думаю, что это возвращаемое значение вашего выражения. Это случай в рубине с методом puts.