Когда вы вводите «привет, мир» в Clojure REPL, почему там написано «ноль»?
-
06-07-2019 - |
Вопрос
Я ввел это в 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 с методом puts.