ns является макросом и скрыт, если цитирует имя, чтобы избавить вас от хлопот:
user> (macroexpand '(ns foo))
(do (clojure.core/in-ns (quote foo)) (clojure.core/with-loading-context
(clojure.core/refer (quote clojure.core))))
другие функции не могут получить аргументы без кавычек, потому что они являются функциями, и функции имеют свои аргументы, которые сначала оцениваются .
макрос ns, как макрос , получает возможность просмотреть и перевернуть свои аргументы до того, как они будут оценены , чтобы он мог получить пространство my-new-name до того, как читатель попытается искать его как имя переменной.
короче говоря, это сохраняет износ и тары на клавиатуре и запястьях;) Шучу, в обоих случаях то, что получает функция, является символом, который они просто различают в том, что вы должны сделать, чтобы передать им этот символ.
для сравнения; если вам куда идти дальше и пропустить (ns 'my-new-namespace)
то получится символ 'my-new-namespace
цитата и все! вы, вероятно, не хотите, чтобы цитата была частью пространства имен.
если вы хотите, чтобы это было непротиворечивым, вы могли бы написать макросы-обертки, которые принимают символы без кавычек для остальных функций пространства имен, которые просто заключают в кавычки первый аргумент и возвращают вызов реальной функции (помните, что макросы возвращают код для вызова )
(defmacro my-find-ns [name]
`(find-ns (quote ~name)))
хотя это нарушит "первое правило макроклуба"
ошибка, связанная с тем, что аргумент является списком, вызвана попыткой использовать (quote my-new-namespace)
в качестве имени
user> (macroexpand '(ns 'foo))
(do (clojure.core/in-ns (quote (quote foo))) (clojure.core/with-loading-context
(clojure.core/refer (quote clojure.core))))