2015-12-06 9 views
5

Quando uso alcuni nomi di funzione lungo, ho usato la forma use, in questo modo:Perché utilizzare virgolette singole attorno al vettore in "uso" (in clojure)?

(use '[clojure.string :as str]) 

Ma non so il motivo per cui aggiungere una singola citazione'al vettore, così ho cercato di capire il suo tipo:

(type '[clojure.string :as str]) 
;=> clojure.lang.PersistentVector 

esempio semplificato:

(type ["hello"]) 
;=> clojure.lang.PersistentVector 

(type '["hello"]) 
;=> clojure.lang.PersistentVector 

sembra la virgola non cambia nulla, qualcuno può spiegarne l'utilizzo nel modulo use?

risposta

10

L'intento è di citare i simboli . In questo modo verranno trattati come simboli e use può prendere quei simboli come denominazione di un namespace da caricare e trascinare nella corrente. Si desidera evitare il trattamento predefinito di un simbolo, che lo risolve come il nome di un Var e utilizza il valore di tale Var. Puoi anche farlo come

(use ['clojure.string :as 'str]) 

ma ciò comporta una digitazione non necessaria; citare l'intero vettore ti fa meno probabilità di dimenticare qualsiasi cosa. Soprattutto se stai facendo qualcosa con :only, :refer o argomenti di parole chiave simili.

parte: ns non bisogno di questo perché come una macro può controllare la valutazione dei suoi argomenti - funzioni come require e use hanno tutti i loro argomenti letti e valutati prima che si gestiscono. Questo è uno dei motivi per cui ns è normalmente preferito rispetto a quelle funzioni.

3

use è una funzione, quindi il valutatore valuta i suoi argomenti prima che vengano passati (valutazione dell'ordine applicativo).

Non si desidera valutare [clojure.string :as str] in quanto il valutatore cercherebbe di risolvere i simboli senza successo prima di applicare use.

Quindi quote (stenoscopio del lettore ') è lì per impedire la loro valutazione.

Problemi correlati