Макросы в Cider repl (например ->)

Почему используется макрос многопоточности ->> выдает ошибку в cider-repl:

(-> "x..")

//  Unable to resolve symbol: -> in this context

1 ответ

Решение

Это происходит, когда вы создаете новое пространство имен в repl и еще ничего не определили в нем. поэтому псевдонимы для функций clojure.core еще не установлены:

Начнем с создания нового пустого пространства имен:

user> (in-ns 'i-dont-exist-yet)
#namespace[i-dont-exist-yet]

Затем попробуйте использовать макрос потоков (или что-нибудь из clojure.core):

i-dont-exist-yet> (-> 1)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: -> in this context, compiling:(*cider-repl api*:47:18) 

который не может найти символ -> в текущем пространстве имен, хотя это работает, если вы скажете ему, какое пространство имен использовать явно:

i-dont-exist-yet> (clojure.core/-> 1)
1

В clojure.core есть удобная функция, которая добавит все ожидаемые ссылки для вашего нового namespce. Вам не нужно будет делать это, когда вы создаете свое пространство имен из файла с ns макрос в верхней части, потому что ns делает это для вас (среди других полезных вещей):

i-dont-exist-yet> (clojure.core/refer-clojure)
nil
i-dont-exist-yet> (-> 1)
1
Другие вопросы по тегам