2010-10-17 14 views
13

Sto cercando un elenco dei caratteri consentiti in una parola chiave clojure. Specificamente sono interessato a sapere se uno qualsiasi dei seguenti caratteri è permesso: -_/.Quali sono i caratteri consentiti in una parola chiave Clojure?

Non sono un programmatore Java, quindi non conoscerei le eventuali implicazioni. Non so se la parola chiave clojure sia mappata su una parola chiave java se esiste una cosa del genere.

risposta

14

Edit:

Quando inizialmente ho composto questa risposta, mi era probabilmente un po 'troppo pesantemente investito nella questione del "che cosa si può farla franca?" Tuttavia, a mio parere, la questione relativa all'ammissibilità delle parole chiave sembra ancora instabile. Quindi:

In primo luogo, un po 'di parole chiave, per i nuovi lettori:

  • Parole sono disponibili in due versioni, qualificate e non qualificate. Le parole chiave non qualificate, come :foo, non hanno alcun componente dello spazio dei nomi. Le parole chiave qualificate sembrano :foo/bar dove la parte precedente alla barra è lo spazio dei nomi, apparentemente. Le parole chiave non possono essere riferite e possono essere assegnate a uno spazio dei nomi inesistente, quindi il loro comportamento nello spazio dei nomi è diverso dagli altri oggetti Clojure.
  • Le parole chiave possono essere create da letterali al lettore, come :foo, o dalla funzione keyword, che è (keyword name-str) o (keyword nsname).
  • Le parole chiave si valutano solo, a differenza dei simboli che puntano a vars. Le parole chiave non sono simboli.

Cosa è ufficialmente consentito?

In base allo reader documentation è consentita una singola barra, non ci sono periodi nel nome e tutte le regole relative ai simboli.

Che cosa è effettivamente consentito?

Più o meno nulla, ma gli spazi sembrano essere consentiti nel lettore. Ad esempio,

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

Appare legale. Lo spazio dei nomi per la suddetta parola chiave è:

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

Quindi lo spazio dei nomi sembra consistere di tutto prima dell'ultima barra.

La funzione keyword è ancora più permissiva:

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

E allo stesso modo, gli spazi vanno bene anche se si utilizza la funzione keyword. Non sono sicuro di quali siano le limitazioni poste sui caratteri Unicode, ma il REPL non sembra lamentarsi quando inserisco caratteri arbitrari.

Che cosa è probabile che accada in futuro:

Ci sono state alcune avvisaglie circa la convalida parole chiave come sono internati. Presumibilmente uno dei più aperti clojure tickets riguarda la convalida delle parole chiave. Quindi la funzione delle parole chiave potrebbe smettere di essere così permissiva in futuro, anche se sembra essere nell'aria. Vedi il ticket dell'assembla e google group discussion.

+0

Interessante. Quello che voglio veramente fare è usare le variabili di percorso come parole chiave. E non voglio neanche usare ":". E i miei caratteri variabili di percorso sono limitati a # "[A-Za-z0-9 -_ \ /]". Quindi penso che dovrebbe essere ok in quel caso. – Santosh

+0

Penso che la vera risposta sia quella di puntare a [la documentazione del lettore] (http://clojure.org/reader), che ad esempio proibisce chiaramente diverse barre nelle parole chiave e nei simboli. – kotarak

+0

@kotarak: Proibisce chiaramente che nel caso dei simboli. Dal momento che le parole chiave non sono simboli, e tutta la documentazione dice che "le parole chiave sono come simboli", direi che è chiaro come il fango. –

4

Da tale elenco, il lettore consente certamente - e _, ma/ha un significato speciale come delimitatore tra spazi dei nomi e nomi di simboli. Il periodo (che non è stato chiesto) è problematico anche all'interno dei nomi dei simboli, poiché viene utilizzato in nomi di classi Java pienamente qualificati.

Per quanto riguarda l'idioma Clojure, - è il tuo migliore amico in nomi di simboli. Prende il posto del caso cammello in Java o il trattino basso in Ruby.

+0

Grazie Questo è quello che volevo sapere. – Santosh

+0

@Santosh: In tal caso, è necessario accettare questa risposta facendo clic sul segno di spunta a sinistra. Potresti voler aspettare un po 'per vedere se qualcun altro risponde con informazioni aggiuntive che non sapevi di volere sapere. – intuited

6

La risposta "corretta" è documented:

simboli iniziano con un carattere non numerico e possono contenere caratteri alfanumerici e *, +, -, _, e!? (altri caratteri saranno ammessi alla fine, ma non tutti i personaggi macro sono stati determinati). '/' ha un significato speciale, può essere usato una volta nel mezzo di un simbolo per separare lo spazio dei nomi dal nome, ad es. my-namespace/foo. '/' indica di per sé la funzione di divisione. '' ha un significato speciale: può essere utilizzato una o più volte nel mezzo di un simbolo per designare un nome di classe completo, ad es. java.util.BitSet o nei nomi dei namespace. Simboli che iniziano o terminano con '.' sono riservati da Clojure. Simboli contenenti/o. si dice che siano "qualificati". I simboli che iniziano o finiscono con ':' sono riservati a Clojure. Un simbolo può contenere uno o più ':' s non ripetibili.

Edit: E più avanti rispetto alle parole chiave:

Le parole chiave sono come i simboli, ad eccezione di:
* Essi possono e devono iniziare con i due punti, per esempio : Fred.
* Non possono contenere '.' o nome classi.
* Una parola chiave che inizia con due punti si risolve nello spazio dei nomi corrente

+0

Le parole chiave non sono simboli. –

+0

@Rob Lachlan: Ma le regole per i simboli sono applicabili alle parole chiave. C'è una piccola variazione annotata nei documenti collegati che ho modificato nella mia risposta. –

+0

Prima di tutto: +1. In secondo luogo, immagino che il problema che ho davvero con questo è che: il lettore non impone un buon comportamento, e b: sembra che non ci siano grossi danni nel consentire stringhe arbitrarie come nomi di parole chiave e spazi dei nomi. Dal momento che tutto ciò che realmente sono sono stringhe e hash in una ConcurrentHashMap. Attualmente, la funzione di parola chiave ci consente di inserire qualsiasi stringa errata che vogliamo come nomi di parole chiave e spazi dei nomi. Voterò che rimanga così, ma ammetterò che la domanda (di quale comportamento dovrebbe prevalere) è al di sopra del mio voto di paga. –

3

a partire dal 1.3 è possibile utilizzare ' ovunque non iniziare una parola chiave. così :arthur's-keyword è consentito ora :)

Io uso le parole chiave :-P e :-D per rendere il mio codice di tanto in tanto (come sinonimi di vere e false)

+0

+1 per :-P e :-D! – Gert

+0

I tuoi sinonimi sono senza tempo! –

Problemi correlati