si utilizza apply
per convertire una funzione che lavora su vari argomenti per uno che funziona su una singola sequenza di argomenti. È inoltre possibile inserire argomenti prima della sequenza. Ad esempio, map
può funzionare su più sequenze. Questo esempio (da ClojureDocs) utilizza map
per trasporre una matrice.
user=> (apply map vector [[:a :b] [:c :d]])
([:a :c] [:b :d])
L'argomento inserito qui è vector
. Quindi lo apply
si espande a
user=> (map vector [:a :b] [:c :d])
Carino!
PS Per restituire un vettore di vettori al posto di una sequenza di vettori, avvolgere il tutto in vec
:
user=> (vec (apply map vector [[:a :b] [:c :d]]))
Mentre siamo qui, vec
potrebbe essere definito come (partial apply vector)
, anche se non è .
Riguardo a Lisp-1 e Lisp-2: i numeri 1 e 2 indicano il numero di cose che un nome può denotare in un dato contesto. In un Lisp-2, puoi avere due cose diverse (una funzione e una variabile) con lo stesso nome. Quindi, ovunque sia valido, è necessario decorare il programma con qualcosa per indicare ciò che intendi. Per fortuna, Clojure (o Scheme ...) consente a un nome di denotare solo una cosa, quindi non sono necessarie tali decorazioni.
Ecco una sostanza con il codice sorgente della funzione applica: https://gist.github.com/purplejacket/36de7061061ec9c49734 – Purplejacket