Когда вы вводите "привет, мир" в Clojure REPL, почему он говорит "ноль"?
Я набрал это в Clojure REPL (используя плагин enclojure Netbeans):
user=> "hello, world"
"hello, world"
nil
Что за ноль?
4 ответа
Каждый вызов функции или макроса возвращает значение в 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.