Я ввел это в Clojure REPL (используя плагин enclojure Netbeans):
user=> "hello, world"
"hello, world"
nil
Что за ноль?
Я ввел это в Clojure REPL (используя плагин enclojure Netbeans):
user=> "hello, world"
"hello, world"
nil
Что за ноль?
Каждая функция или вызов макроса возвращает значение в Clojure, даже такие вещи, как операторы if, конструкции цикла, определения функций верхнего уровня или операторы печати, которые в других языках являются «операторами». В Лиспе нет дихотомии оператор / выражение; все есть выражение.
Итак, 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 как двух разных выражений под окнами. Возвращаемое значение строки в clojure должно быть самой строкой.
я думаю, это возвращаемое значение вашего выражения. Так обстоит дело с Ruby с методом put.