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.