Il seguente codice è dal capitolo 8.1.1 del (la seconda edizione di) The Joy of Clojure da Fogus, Houser:costruzione si toglie la quotatura in contestuale-eval nella gioia di Clojure
(defn contextual-eval [ctx expr]
(eval
`(let [[email protected](mapcat (fn [[k v]] [k `'~v]) ctx)] ; Build let bindings at compile time
~expr)))
(contextual-eval '{a 1, b 2} '(+ a b))
;;=> 3
(contextual-eval '{a 1, b 2} '(let [b 1000] (+ a b)))
;;=> 1001
faccio Non capisco davvero il significato della costruzione `'~v
. Qualcuno può approfondire su questo?
Nel libro, si dice soltanto che
Gli attacchi realizzati uso l'interessante ` '~ v modello di raccogliere il valore del costruito binding in fase di esecuzione.
Per esempio
(contextual-eval '{a 1, b 2} '(+ a b))
è espansa per
(let [a '1 b '2] (+ a b)))
e non capisco il motivo per cui vengono introdotti quelle citazioni, che cosa sono buone per.
Inoltre, abbiamo il seguente comportamento:
(contextual-eval '{a 1, b (+ a 1)} '(+ a b))
ClassCastException clojure.lang.PersistentList cannot be cast to java.lang.Number
(defn contextual-eval' [ctx expr]
(eval
`(let [[email protected](mapcat (fn [[k v]] [k v]) ctx)]
~expr)))
(contextual-eval' '{a 1, b (+ a 1)} '(+ a b))
;=> 3
Grazie per la risposta. Ma quello che hai scritto è esattamente ciò che ho già capito;). Quello che non capisco è * perché * gli autori introducono che citano del tutto. Ad esempio,
(contextual-eval '{a 1, b 2} '(+ a b))
viene espanso a(let [a '1 b '2] (+ a b))
. A cosa servono queste citazioni ('1 e' 2)? –Grazie, lo aggiungerò alla mia risposta. –
Dovrei aggiungere che questi moduli si presentano molto raramente nel normale codice del clojure, se mai lo fanno. È bello capirli e pensare attentamente a quello che stai facendo se ti ritrovi a usarli davvero. –