Clojure String Возвращаемые значения - PullRequest
7 голосов
/ 26 марта 2011

просто быстрый вопрос, глядя на Clojure ....

Учитывая следующую сессию REPL:

Clojure 1.2.0
user=> "bar"
"bar"
user=> (print "bar")
barnil
user=> (defn foo [] ("bar"))
#'user/foo
user=> (foo)
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)
user=> (print foo)
#<user$foo user$foo@65dcc2a3>nil
user=> (print (foo))
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn(NO_SOURCE_FILE:0)

Почему строка "String" не отображается функцией печати? Кажется, читатель пытается разрешить возвращаемое значение foo (которое выглядит как String) как функцию? Как определить, что print запишет строку в командную строку?

Ответы [ 2 ]

16 голосов
/ 27 марта 2011

Я все еще немного слаб в Clojure по сравнению с другими Лиспами, но это не так, не так ли?Должно быть

(defn foo [] "bar")

, иначе вы определили функцию, которая пытается вызвать строку "bar" как функцию, что соответствует вашей ошибке.

mress:10004 Z$ clj
Clojure 1.2.0
user=> (defn foo [] "bar")
#'user/foo
user=> (foo)
"bar"
6 голосов
/ 27 марта 2011

потому что Clojure пытается «разрешить» первый элемент любого списка в качестве имени функции когда вы в последнем отчете вызываете функцию печати, она вызывается с одним аргументом list (foo), который интерпретируется как вызов функции foo. пока все хорошо.

но функция foo возвращает список ("bar"), который не в порядке .. он интерпретируется как вызов функции "bar", которая не разрешена ..

если foo похож (defn foo [] «bar»), то он будет работать, потому что print не получит («bar»), а просто «bar» и сделать печать

...