Я не знаю однозначного ответа на ваш вопрос, но мое обоснованное предположение состоит в том, что вы не можете без изменения самой clojure. Вот мой анализ:
Символ String
встроен в clojure/lang/Namespace.java
как часть отображений по умолчанию (см. Конструктор Namespace
в этом классе, который ссылается на DEFAULT_MAPPINGS
в классе clojure/lang/RT.java
). Стажировка означает наличие ключа в переменной-члене mappings
класса Namespace. Результатом этого является то, что каждое пространство имен начинается с String
, сопоставленного с String.class
(см. Строку 77 в RT.java в clojure 1.4.0).
В макросе ns
вы можете сделать что-то вроде:
(ns my-ns
(:refer-clojure :exclude [<mapping to exclude>]))
но все, что делает, это пропускает код, который интернирует новые символы (см. Строку 3770 из clojure / core.clj в clojure 1.4.0), поэтому он не может ничего сделать, чтобы помочь вам удалить String
из отображений пространства имен .
Наконец, если вы попытаетесь переопределить отображение для String
с помощью чего-то вроде (defn String ...)
, компилятор будет жаловаться, потому что String.class
не является экземпляром Var
. Подробности смотрите в строке 6797 clojure / lang / Compiler.java в clojure 1.4.0).