2010-10-17 25 views
13

Estoy buscando una lista de los caracteres permitidos en una palabra clave clojure. Específicamente, me interesa saber si se permite alguno de los siguientes caracteres: -_/.¿Cuáles son los caracteres permitidos en una palabra clave Clojure?

No soy un programador de Java, por lo que no sabría las ramificaciones subyacentes, en su caso. No sé si la palabra clave clojure está asignada a una palabra clave java si existe tal cosa.

Respuesta

14

Editar:

Al principio, cuando compuse esta respuesta, que fue probablemente un poco demasiado invertido en la cuestión de "qué se puede conseguir lejos con?" Para ser justos conmigo mismo, la cuestión de la admisibilidad de la palabra clave parece estar todavía sin resolver. Por lo tanto:

En primer lugar, un poco de palabras clave, para los nuevos lectores:

  • Palabras clave vienen en dos sabores, cualificados y no cualificados. Las palabras clave no calificadas, como :foo, no tienen componente de espacio de nombres. Las palabras clave calificadas se parecen a :foo/bar donde la parte anterior a la barra es el espacio de nombre, ostensiblemente. No se puede hacer referencia a las palabras clave y se les puede dar un espacio de nombres inexistente, por lo que su comportamiento del espacio de nombres es diferente de otros objetos de Clojure.
  • Las palabras clave se pueden crear por literales para el lector, como :foo, o por la función keyword, que es (keyword name-str) o (keyword nsname).
  • Las palabras clave se evalúan solo a sí mismas, a diferencia de los símbolos que apuntan a vars. Tenga en cuenta que las palabras clave no son símbolos.

¿Qué está oficialmente permitido?

De acuerdo con reader documentation, se permite una sola barra, no hay puntos en el nombre, y todas las reglas que hacer con los símbolos.

¿Qué está realmente permitido?

Más o menos todo menos espacios parecen estar permitidos en el lector. Por ejemplo,

user> :-_./asdfgse/aser/se 
:-_./asdfgse/aser/se 

Parece ser legal. El espacio de nombres para la palabra clave anterior es:

user> (namespace :-_./asdfgse/aser/se) 
"-_./asdfgse/aser" 

lo tanto, el espacio de nombres parece consistir en todo antes de la última barra inclinada.

La función keyword es aún más permisiva:

user> (keyword "////+" "/////") 
:////+////// 
user> (namespace (keyword "////+" "/////")) 
"////+" 

Y del mismo modo, los espacios son muy bien también si se utiliza la función keyword. No estoy seguro de qué limitaciones se aplican a los caracteres Unicode, pero el REPL no parece quejarse cuando ingreso caracteres arbitrarios.

Qué es probable que suceda en el futuro:

Ha habido algunos rumores sobre las palabras clave de validación, ya que están internados. Supuestamente uno de los abiertos más largos clojure tickets se refiere a la validación de palabras clave. Entonces, la función de palabra clave puede dejar de ser tan permisiva en el futuro, aunque parezca estar en el aire. Vea el ticket de montaje y google group discussion.

+0

Interesante. Lo que realmente quiero hacer es usar variables de ruta como palabras clave. Y ni siquiera quiero usar el ":". Y mis caracteres variables de ruta están restringidos a # "[A-Za-z0-9 -_ \ /]". Entonces creo que debería estar bien en ese caso. – Santosh

+0

Creo que la verdadera respuesta es apuntar a [la documentación del lector] (http://clojure.org/reader), que, por ejemplo, prohíbe claramente varias barras en palabras clave y símbolos. – kotarak

+0

@kotarak: claramente lo prohíbe en el caso de los símbolos. Dado que las palabras clave no son símbolos, y toda la documentación dice que "las palabras clave son como símbolos", diría que es claro como el barro. –

4

De esa lista, el lector ciertamente permite - y _, pero/tiene un significado especial como el delimitador entre espacios de nombres y nombres de símbolos. El período (que no preguntaste) también es problemático dentro de los nombres de los símbolos, ya que se usa en nombres de clases de Java totalmente calificados.

En lo que se refiere a Clojure, es su mejor amigo en los nombres de los símbolos. Toma el lugar de la caja de camello en Java o el guión bajo en Ruby.

+0

Gracias Eso es lo que quería saber. – Santosh

+0

@Santosh: en ese caso, debe aceptar esta respuesta haciendo clic en la marca de verificación a la izquierda. Es posible que desee esperar un poco para ver si alguien más responde con información adicional que no sabía que deseaba saber. – intuited

6

La respuesta "correcta" es documented:

Símbolos comienzan con un carácter no numérico y pueden contener caracteres alfanuméricos y *, +, -, _, y!? (otros caracteres serán permitidos eventualmente, pero no todos los caracteres macro han sido determinados). '/' tiene un significado especial, se puede usar una vez en medio de un símbolo para separar el espacio de nombres del nombre, p. mi-namespace/foo '/' por sí mismo nombra la función de división. ''. tiene un significado especial: se puede usar una o más veces en medio de un símbolo para designar un nombre de clase totalmente calificado, p. java.util.BitSet, o en nombres de espacios de nombres. Símbolos que comienzan o terminan con '.' están reservados por Clojure. Símbolos que contienen/o. se dice que son "calificados". Los símbolos que comienzan o terminan con ':' están reservados por Clojure. Un símbolo puede contener uno o más ':' no repetitivos.

Editar: Y además con respecto a las palabras clave:

Las palabras clave son como símbolos, excepto:
* Pueden y deben comenzar con dos puntos, por ejemplo, : fred
* No pueden contener '.' o clases de nombre.
* Una palabra clave que comienza con dos puntos dobles se resuelve en el espacio de nombres actual

+0

Las palabras clave no son símbolos. –

+0

@Rob Lachlan: Pero las reglas para los símbolos son aplicables a las palabras clave. Hay una pequeña variación anotada en los documentos vinculados que edité en mi respuesta. –

+0

Primero de todos: +1. En segundo lugar, supongo que el problema que realmente tengo con esto es que a: el lector no aplica buen comportamiento, yb: no parece haber gran daño al permitir cadenas arbitrarias como nombres de palabras clave y espacios de nombres. Como todo lo que realmente son son cadenas y hashes en un ConcurrentHashMap. Actualmente, la función de palabra clave nos permite poner cualquier cadena de tontos que deseemos como nombres de palabras clave y espacios de nombres. Yo votaría que siga así, pero concederé que la pregunta (de qué comportamiento debe prevalecer) está por encima de mi nota salarial. –

3

a partir de 1.3 se puede utilizar en cualquier lugar que no empiezan ' una palabra clave. por lo :arthur's-keyword se permite ahora :)

que utilizar las palabras clave :-P y :-D para darle vida a mi código de vez en cuando (como sinónimos de verdaderos y falsos)

+0

+1 para :-P y :-D! – Gert

+0

¡Tus sinónimos son intemporales! –

Cuestiones relacionadas