Когда вы набираете "hello, world" в Clojure REPL, почему он говорит "nil"?
Я набрал это в Clojure REPL (с помощью плагина Netbeans):
user=> "hello, world"
"hello, world"
nil
Что за ноль?
Ответ 1
Каждая функция или макровызов возвращает значение в Clojure, даже такие вещи, как выражения if или конструкции циклов, или определения функций уровня или инструкции печати, которые на других языках являются "утверждениями". Там нет дихотомии постановки/выражения в Lisps; все это выражение.
So println и друзья печатают на стандартный вывод как побочный эффект и возвращают nil, как и большинство функций, которые не имеют ничего полезного для возврата.
Но ввод строки в REPL должен возвращать сама строка, как в сообщении digitalross '.
В первом случае строка hello world - это то, что было напечатано на стандартный вывод на println. nil - возвращаемое значение println. Во втором случае "hello world" - это возвращаемое значение "hello world", поскольку строка оценивает себя. В этом случае ничего не печатается на стандартный вывод.
(SLIME и некоторые другие REPL-интерфейсы будут по-разному окрашивать стандартный вывод (строка hello world выше) по сравнению с возвращаемым значением того, что вы набрали в REPL (nil выше), так как это может ввести в заблуждение иначе. )
Это то, что вы должны увидеть в REPL. То, что вы разместили, должно быть артефактом Enclojure.
Есть несколько недавних ошибок, связанных с интерпретацией последовательности строк CRLF в виде двух разных выражений под окнами. Возвращаемое значение строки в clojure должно быть строкой.
Ответ 4
Я думаю, что это возвращаемое значение вашего выражения. Это случай в рубине с методом puts.