2012-05-30 9 views
16

Ho difficoltà a capire (e quindi ricordare) che il clojure richiede la sintassi qui descritta: http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require. Sembra sia contro intuitivo che non uniforme.clojure richiede la logica della sintassi

Per esempio, nel seguito perché è questo vettore a cui devono essere citato:

(require '[clj-json.core :as json]) 

contro intuitivo perché normalmente i vettori non sono quotati in clojure (liste sono citati e vettori sono trattati come dati).

E non uniforme, perché in questo caso il vettore è non quotate:

(ns xxx 
    (:require [clj-json.core :as json])) 

mi rendo conto che la funzione di richiedere e l'utilizzo :require all'interno della macro ns sono solo visivamente simili, ma ancora.

Ci sono altri pezzi di stranezze così, per esempio posso fare questo:

(require '(clj-json.core)) 

Ma non posso fare questo:

(require '(clj-json.core :as json)) 

Qualcuno può rispondere a queste domande:

  1. nel primo esempio perché il vettore deve essere quotato?
  2. perché non deve essere citato nella macro ns?
  3. perché la notazione elenco non consente :as?

Mi chiedo se ci sono motivi per cui le cose sono come sono o se l'incoerenza non è stata notata in fase di progettazione.

+0

Partenza [questa discussione] (https://groups.google.com/forum/?fromgroups#!searchin/clojure-dev/ns$20macro/clojure-dev/6EEfdPhrWgk/qJALczHTzpkJ) sul clojure -della lista se non l'hai già visto. L'ho trovato abbastanza istruttivo. – Jeremy

risposta

11
  1. nel primo esempio perché il vettore deve essere quotato?

require è una funzione, quindi è necessario citarli per evitare la valutazione. Altrimenti, tali simboli verranno ricercati nel contesto corrente, con la probabilità di generare un errore o un comportamento imprevisto. A proposito, penso che non sia giusto: "Contro intuitivo perché normalmente i vettori non sono citati in clojure (le liste sono citate ei vettori sono trattati come dati)."

Potrebbe non essere intuitivo, tuttavia non c'è nulla di sbagliato nel quotare vettori (o mappe o set). Faccio spesso quando si verifica rapidamente qualcosa al REPL, e non voglio digitare un : per ogni parola chiave in una mappa o un vettore, per esempio:

user=> '{a 1 b 2 c 3} 

piuttosto che:

user=> {:a 1 :b 2 :c 3} 

Il il primo è molto più veloce da digitare se voglio solo ottenere rapidamente alcuni dati per testare qualcosa.

  1. perché non deve essere indicato nella macro ns?

macro non valutano i loro argomenti, che sono una sorta di più pigro di chiamate di funzione normale, in modo che i simboli (clj-json.core e json) non hanno bisogno di essere citati per evitare la valutazione.

  1. perché la notazione elenco non consente: come?

Scusa, non conosco la risposta a questo.

Ah, ho dato un'occhiata ai documenti per require e scoperto. C'è un altro modulo supportato:

"Quanto segue carica le librerie clojure.zip e clojure.set abbreviato come 's'."

(require '(clojure zip [set :as s])) 
+3

ok quindi ho appena realizzato (dopo la tua spiegazione) che '(require ['clj-json.core: as' json])' funziona (vettore non quotato) ma richiede di quotare due volte anziché una volta (probabilmente perché il vettore quotato è preferito) . Il mondo ha solo bisogno di senso e quindi posso accettarlo. – Kevin

+0

Sì, stavo proprio per modificare o commentare con quell'esempio pensando che potesse essere d'aiuto. Qualcosa non ha ancora senso? – spacemanaki

+0

con l'ultimo esempio perché non consentire '(require '(clj-json.core: as json))'? Presumo che consentire ciò renderebbe qualche altra forma accettata ambigua o qualcosa del genere ... – Kevin