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

Я ввел это в Clojure REPL (используя плагин enclojure Netbeans):

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

Что за ноль?


person uzo    schedule 12.09.2009    source источник


Ответы (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.

person Brian Carper    schedule 12.09.2009
comment
Очень полезно. Спасибо. Интересно, есть ли проблема с моей установкой enclojure или это, как вы говорите, ожидаемый артефакт enclojure. Мне также интересно, с какими еще артефактами я могу столкнуться, если продолжу использовать enclojure. - person uzo; 13.09.2009

Не могу воспроизвести ...

В Clojure 1.0.0 этого не происходит.

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

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

person Arthur Ulfeldt    schedule 16.09.2009

я думаю, это возвращаемое значение вашего выражения. Так обстоит дело с Ruby с методом put.

person Eimantas    schedule 12.09.2009
comment
Выражение является строковым литералом, а возвращаемое значение - строкой. - person Chris Vest; 13.09.2009