Когда вы вводите "привет, мир" в 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.

Другие вопросы по тегам