2012-06-14 16 views
8

¿Por qué las bibliotecas de clojure reutilizan los nombres de funciones que se producen comúnmente y que lo fuerzan a namespace calificarlos? Por ejemplo, clojure.zip usa siguiente, reemplaza y elimina que ya existe en clojure core y "replace" ya existe en clojure.string.por qué las bibliotecas clojure no intentan utilizar nombres únicos para nombres de funciones comunes

Ahora el desarrollador probablemente usará alguna abreviatura para el espacio de nombres clojure.zip , por lo que en un código de desarrollador clojure.zip/next será espacio de nombres calificado como z/siguiente en el código de otra persona como w/siguiente, etc. Esto lo forzará a mirar hacia atrás para ver cuál es la abreviatura de espacio de nombre en realidad porque el desarrollador podría haber creado su propia biblioteca que también usa la función "siguiente"

¿Por qué no zip-next, zip-replace y zip-remove, str-replace? O algo así

Luego habrá una "calificación de espacio de nombres" consistente en el código de las personas y quedará claro a qué se refieren estas funciones.

No es que haya cientos de nombres de enfrentamientos entre bibliotecas. Normalmente veo solo dos o tres. ¿Es tan difícil hacer explícitamente que estos nombres sean únicos para la biblioteca?

Respuesta

20

En general usando use para incluir las bibliotecas es menos popular que el uso de require en apariencia normal código clojure, por lo que el uso de nombres más largos único es menos útil cuando el espacio de nombres ya se transmite el mismo significado programadores de modo clojure tienden a preferir la brevedad a la singularidad

en lugar de:

(use 'liba 'libb) 

(liba-foo 1 2 3) 
(libb-foo 1 2 2) 

personas podrían luego escribir:

(require ['liba :as 'a] [libb :as 'b]) 

(a/liba-foo 1 2 3) 
(b/libb-foo 1 2 3) 

que hace que el liba- parecer una tontería, por lo tanto:

(a/foo 1 2 3) 
(b/foo 1 2 3) 
+1

Me gusta el hecho de que puede usar un alias más corto para un espacio de nombres. Te da mucho más poder, que es un tema común en Clojure. Aunque puede ser un problema si algunos programadores usan alias inapropiados o incluso alias más largos que el espacio de nombres original. – adamjmarkham

+1

Realmente no entiendo tu comentario CL; hay muchos nombres realmente cortos en CL y los largos no parecen tener que ver con el espacio de nombres. –

+0

Debo admitir que el comentario proviene de mi frusteration personal con un par de bibliotecas. Lo siento CL amigos, voy a jugar bien :-( –

9

Si usted va a requerir que los nombres sean globalmente únicos, ¿por qué tienen espacios de nombres? Si defino la biblioteca de helados y prefijo el nombre de cada función con helado, nadie puede entrar en conflicto.

Pero esto es terriblemente incómodo para ambas partes: todos tenemos que seguir escribiendo este estúpido prefijo una y otra vez. Si en lugar de icecream-scoop, nombré mi scool de función dentro del helado del espacio de nombres, tiene opciones de cómo referirse a él: puede llamarlo primitivo si está claro desde el contexto y no entra en conflicto con su espacio de nombres, o icecream/primicia, o postre/primicia, lo que sea que necesites para que se lea bien.

+0

Estos nombres de funciones como reemplazar, eliminar, invertir son tan comunes que no puede decir lo que significan si no están calificados para el espacio de nombre. Por lo tanto, DEBE nombrar espacios que los califiquen. No puede simplemente usar "reemplazar" en su código, ahora lo que significará, pero otras personas no lo harán y tendrán que detenerse y descubrir a qué espacio de nombres pertenece. Pero ahora las personas tienen la opción de elegir el espacio de nombres calificándolos con cualquier abrev para que se vuelva confuso. Si son espacio de nombre calificado como (por ejemplo) str-replace, entonces sería claro en el código de todos. –

+0

Y no estoy diciendo agregar un prefijo a TODAS las funciones en una biblioteca. Solo para aquellas funciones que tienen nombres comunes que pueden chocar con funciones en otros espacios de nombres. Suena como reemplazar, invertir, etc. Estos son tan comunes que están garantizados para entrar en conflicto –

+0

Entonces mi biblioteca 'icecream' tiene funciones de primicia, sabor, sabor y helado-eliminar? Eso es terrible para la coherencia: el usuario debe recordar qué funciones tienen un prefijo en el nombre y cuáles no. No quiero llamar 'join' y' str-replace'; 'str/join' y' str/replace' es más fácil de escribir y más fácil de leer. – amalloy

Cuestiones relacionadas