2010-02-08 13 views
50

Ho difficoltà a trovare buoni consigli e pratiche comuni per l'uso dei namespace in Clojure. Mi rendo conto che i namespace non sono gli stessi dei pacchetti Java, quindi sto cercando di mettere in evidenza le convenzioni in Clojure, che sembrano sorprendentemente difficili da determinare.Quali sono le convenzioni comuni per l'utilizzo degli spazi dei nomi in Clojure?

penso di avere una buona idea di come dividere le funzioni in file CLJ e anche più o meno come mi piacerebbe vuole organizzare i file in directory. Ma oltre a questo ho difficoltà a trovare i meccanismi per il mio ambiente di sviluppo. Alcune domande correlate:

  1. Utilizzo le stesse convenzioni di unicità per gli spazi dei nomi Clojure come normalmente utilizzerei per i pacchetti Java? [cioè backwards-company-domain.project.subsystem]
  2. Devo salvare i miei file in una struttura di directory che corrisponde ai miei spazi dei nomi? [Ala Java]
  3. Se ho più spazi dei nomi, ho bisogno di compilare tutto il mio codice in un barattolo e aggiungerlo al mio percorso di classe per renderla accessibile?
  4. Ogni spazio dei nomi deve essere compilato in un contenitore? O dovrei creare un singolo jar che contenga il codice clj da molti namespace?

Grazie ...

+6

Rendo retroattivamente un ringraziamento a questo blog che mi avrebbe aiutato molto quando ho scritto questa domanda: http://blog.8thlight.com/articles/2010/12/6/clojure-libs-and uso-import-e-ns -namespaces-richiede- –

risposta

41
  1. Credo che sia ok se si pensa che aiuta, ma molti progetti Clojure non si fa così - cf. Compojure (usando una composizione di alto livello e varie composizioni. * Ns per funzionalità specifiche), Ring, Leiningen ... Clojure stessa usa clojure. * (E clojure.contrib. * Per le librerie contrib), ma questo è un caso speciale, Credo.

  2. Sì! Devi assolutamente fare, altrimenti Clojure non sarà in grado di trovare i tuoi spazi dei nomi. Si noti inoltre che si musn't utilizzare la sottolineatura nei nomi dello spazio dei nomi o il trattino nei nomi dei file e dove si utilizza un trattino nel nome dello spazio dei nomi, è necessario utilizzare un carattere di sottolineatura nel nome del file (in modo che i ns my.cool-project è definita in un file chiamato cool_project.clj in una directory denominata my).

  3. È necessario assicurarsi che tutto il materiale sia sul classpath, ma non importa se è in un barattolo, più giare, una mistura di barattoli e directory sul filesystem ... Fintanto che obbedisce le convenzioni di denominazione corrette (il punto numero 2) dovresti stare bene.

    Tuttavia, non mi compilare quasi niente ahead-of-time se non c'è nessun motivo particolare per farlo - questo potrebbe impedire il codice da essere portatile attraverso varie versioni di Clojure senza fornire alcun beneficio oltre ad un tempo di caricamento leggermente migliorata .

    Avrai ancora bisogno di utilizzare la compilazione AOT a volte, in particolare in alcuni scenari di interoperabilità Java - la documentazione delle funzioni rilevanti/macro cita sempre quella. Ci sono esempi di cose che richiedono AOT in clojure.contrib; Non ne ho mai avuto bisogno, quindi non posso fornire molto in termini di dettagli.

  4. direi che si dovrebbe usare vasetti per le unità funzionali del codice. Per esempio. Compojure e Ring vengono impacchettati come singoli vasi contenenti molti spazi dei nomi che insieme compongono l'intero pacchetto. Inoltre, clojure.contrib è notevolmente impacchettato come un singolo jar con più librerie non correlate; ma quello potrebbe essere di nuovo un caso speciale.

    D'altra parte, un singolo contenitore contenente tutto il codice del progetto e le sue dipendenze potrebbe occasionalmente essere utile per la distribuzione. Controlla the Leiningen build tool e la sua funzione 'uberjar' se pensi che quel genere di cose possa esserti utile.

10
  1. A rigor di termini, non è necessario, anche se molti progetti Java sono scesi tale convenzione, nonché, in particolare per progetti interni o API private. Evita però gli spazi dei nomi a segmento singolo, il che comporterebbe la generazione di file di classe nel pacchetto predefinito.
  2. Sì.

Riguardo a 3 & 4, la compilazione di pacchetti e AOT è interamente ortogonale alla questione delle convenzioni dello spazio dei nomi.

Problemi correlati