Comprensione delle parole chiave del clojure

1

Sto facendo i miei primi passi con Clojure. Altrimenti, sono piuttosto competente con JavaScript, Python, Java e un po 'di C.

Stavo leggendo questo articolo che descrive i vettori e le mappe distruttivi. Per es.

=> (def point [0 0])
=> (let [[x y] point]
=>   (println "the coordinates are:" x y))
the coordinates are: 0 0

ma ho difficoltà a capire le parole chiave. A prima vista, sembrano davvero semplici, in quanto valutano solo a se stessi:

=> :test
:test

Ma sembrano essere usati in così tanti modi diversi e non capisco come pensarli. Ad esempio, puoi anche fare cose del genere:

=> (defn full-name [& {first :first last :last}]
=>   (println first last))
=> (full-name :first "Tom" :last "Brennan")
Tom Brennan
nil

Questo non mi sembra intuitivo. Avrei pensato che gli argomenti avrebbero dovuto essere qualcosa di più:

(full-name {:first "Tom" :last "Brennan"})

perché sembra nella definizione della funzione che stai dicendo "nessun argomento richiesto, ma un numero variabile di argomenti si presenta sotto forma di una singola mappa". Ma sembra più che stai dicendo "non ci sono argomenti richiesti, ma arriva un numero variabile di argomenti che dovrebbero essere un elenco di parole chiave e valori alternati ...?" Non sono davvero sicuro di come avvolgere il mio cervello intorno a questo.

Inoltre, cose del genere mi confondono anche io:

=> (def population {:humans 5 :zombies 1000})
=> (:zombies population)
1000
=> (population :zombies)
1000

In che modo le mappe e le parole chiave diventano improvvisamente funzioni?

Se potessi avere qualche chiarimento sull'uso delle parole chiave in questi due esempi, sarebbe molto utile.

Aggiornamento Ho anche visto link e mentre la risposta accettata è una grande dimostrazione di come usare le parole chiave con destrutturazione e argomenti con nome, sto davvero cercando di capire come pensarli - perché il linguaggio è progettato in questo modo e come posso interiorizzare al meglio il loro uso.

    
posta Community 07.10.2012 - 18:17
fonte

1 risposta

4

il & in (defn full-name [& {first: first last: last}] indica che tutti gli argomenti rimanenti devono essere raccolti in una singola raccolta, la forma destrutturante della mappa che segue il & quindi prende la mappa creata dal & ancora una volta.

(defn full-name [& {first :first last :last}]...)
(full-name :first "Tom" :last "Brennan")

senza il & diventa

 (defn full-name [{first :first last :last}]...)
(full-name {:first "Tom" :last "Brennan"})

per la tua altra domanda: i simboli e le parole chiave implementano l'interfaccia della funzione in modo che possano essere chiamati esattamente come qualsiasi altra funzione Clojure. quando vengono richiamati come funzione si guardano nelle loro argomentazioni che si aspettano essere una mappa (o qualcosa che implementa l'interfaccia appropriata)

    
risposta data 07.10.2012 - 18:48
fonte

Leggi altre domande sui tag