No sé la respuesta definitiva a su pregunta, pero mi conjetura es que no se puede sin modificar clojure sí mismo. Aquí está mi análisis:
El símbolo String
está internado en clojure/lang/Namespace.java
como parte de las asignaciones predeterminadas (véase el constructor Namespace
en esa clase, que hace referencia a DEFAULT_MAPPINGS
en la clase clojure/lang/RT.java
). Internar significa que hay una clave en la variable miembro mappings
de la clase Namespace. El resultado de esto es que cada espacio de nombre comienza con String
mapeado a String.class
(vea la línea 77 de RT.java en clojure 1.4.0).
En el ns
macro, puede hacer algo como:
(ns my-ns
(:refer-clojure :exclude [<mapping to exclude>]))
pero todo lo que hace es saltarse el código que los internos nuevos símbolos (véase la línea 3770 de clojure/core.clj en clojure 1.4.0) , por lo que no puede hacer nada para ayudarlo a eliminar String
de las asignaciones del espacio de nombres.
Por último, si se intenta redefinir la asignación para String
con algo así como un (defn String ...)
el compilador se quejará porque String.class
no es una instancia de Var
. Vea la línea 6797 de clojure/lang/Compiler.java en clojure 1.4.0 para más detalles).
El espacio de nombre clojure.core depende de muchas cosas en java.lang. *, Así que no estoy seguro si es una buena idea redefinir esas clases, incluso si es posible. Por ejemplo, 'str',' keyword', 'for', son funciones y macros que usan la clase' java.lang.String'. –
Creo que esto no debería ser un problema, siempre que no sean macros y utilicen "String" en el tiempo de ejecución. También puedo excluir las funciones de clojure.core que utilizan otras funciones, ya que están totalmente calificadas internamente. Entonces, usar String, cuando se usa internamente java.lang.String no debería ser un problema. –
Por curiosidad, ¿por qué necesitas nombrar tus variables 'Byte' y' String'? – Gert