2010-03-22 14 views
27

Quali caratteristiche meno conosciute ma utili di Clojure ti trovi a usare? Sentiti libero di condividere piccoli trucchi e modi di dire, ma cerca di limitarti a Core e Contrib.Funzioni nascoste di Clojure

ho trovato alcune informazioni molto interessanti le risposte a queste domande simili:

Ci sono molte altre domande "Caratteristica nascosta" per altre lingue, quindi ho pensato che sarebbe stato bello averne uno anche per Clojure.

risposta

12

Il lettore macro leggi-valuta: #=

(read-string "#=(println \"hello\")") 

Questa macro può presentare un rischio per la sicurezza se read è utilizzato su input dell'utente (che è forse una cattiva idea da solo). È possibile disattivare questa macro impostando *read-eval* su false.

24

Clojure ha un tipo di dati di coda persistente e immutabile, PersistentQueue, ma non ha (ancora?) La sintassi del lettore letterale o le funzioni wrapper Clojure, quindi è necessario crearne uno tramite una chiamata Java. Queue conj (push) sul retro e pop dalla parte anteriore con buone prestazioni.

user> (-> (clojure.lang.PersistentQueue/EMPTY) 
      (conj 1 2 3) 
      pop) 
(2 3) 

Elenca le congiunzioni sul davanti e scatta frontalmente. I vettori si combinano sul retro e si aprono dalla parte posteriore. Quindi le code a volte sono esattamente ciò di cui hai bisogno.

user> (->() 
      (conj 1 2 3) 
      pop) 
(2 1) 
user> (-> [] 
      (conj 1 2 3) 
      pop) 
[1 2] 
+0

WOW. schioccando 100.000 elementi da una lista il mio computer impiega ~ 12ms. Convertire la lista in una coda E scoppiando tutto richiede ~ 0.2. Questo è un grande aiuto nel programma che sto scrivendo. – MBCook

13
(defn foo [a & [b c]] ...) 

È possibile destrutturare l'argomento resto.

Aggiornamento:

L'ultima commit al repository git (29389970bcd41998359681d9a4a20ee391a1e07c) ha reso possibile l'esecuzione destrutturazione associativa in questo modo:

(defn foo [a & {b :b c :c}] ...) 

L'uso evidente di questo è per argomenti chiave. Si noti che questo approccio impedisce di combinare gli argomenti delle parole chiave con gli argomenti di riposo (non è probabile che ciò sia necessario molto spesso).

(defn foo [a & {:keys [b c] :or {b "val1" c "val2"}] ...) 

Se si desidera valori predefiniti per argomenti parola chiave.

+0

Hm, non mi rendevo conto che il montaggio delle notizie calde mi avrebbe dato la maggioranza in questa risposta ... Penso che ora ho solo l'idea dietro questa cosa della wiki della comunità. @ denol: per favore non esitare a "riprenderlo" se è importante in qualche modo. –

8

È possibile le funzioni apply in sequenze di argomenti infinite. Ad esempio

(apply concat (repeat '(1 2 3))) 

produce una sequenza artificiale di 1,2,3,1,2,3 ... Naturalmente per far funzionare la funzione deve anche essere pigro rispetto al suo elenco di argomenti.

+1

C'è un modo migliore per farlo (ciclo '(1 2 3)) – nickik

+2

@nickik: Naturalmente - '(ripeti' (1 2 3))' era solo un esempio di sequenza infinita di sequenze per mostrare come '(applica concat ...)' funziona. –

7

Dalla sempre più buon sito ClojureDocs un idioma utilizzando juxt http://clojuredocs.org/clojure_core/clojure.core/juxt

 
;juxt is useful for forking result data to multiple termination functions 
(->> "some text to print and save to a file" 
    ((juxt 
    println 
    (partial spit "useful information.txt")))) 

Problemi correlati