C'è qualcosa Devo mancare sulla macro filettatura in Clojure.differenza dispari tra le funzioni denominate e anonimi quando si utilizza la filettatura macro
devo una mappa con i valori che sono le mappe come bene, e mi piacerebbe una ricerca nel risultato di un'altra ricerca. Lasciate che la mappa sia un semplice {:a {:b 2}}
- prima voglio cercare la chiave :a
, che sta per cedere {:b 2}
, poi cercare b
, il risultato è 2
. La chiave per la seconda ricerca deve essere il risultato di una funzione.
((fn [x] (get x :b)) ({:a {:b 2} } :a))
=> 2
Ok, cerchiamo di renderlo più leggibile con la macro filettatura.
(-> {:a {:b 2} } :a (fn [x] (get x :b)))
Vale a dire applicare :a
come una funzione sulla mappa, quindi applicare un'altra funzione. Beh, questo non funziona: CompilerException java.lang.IllegalArgumentException: Parameter declaration :a should be a vector
Stranamente, se la funzione anonima viene estratto a un nominato uno, allora funziona benissimo:
(defn f [x] (get x :b))
(-> {:a {:b 2} } :a f)
=> 2
O anche:
(def f (fn [x] (get x :b)))
(-> {:a {:b 2} } :a f)
=> 2
Perché c'è una differenza tra il modo in cui funzionano le funzioni con nome e quelle anonime?
Hmm, interessante, grazie. Ho bisogno di orientarmi sui macro: ovviamente "il primo argomento per ogni sottomaschera" non significa "prima argomentazione della funzione anonima" - è così che inizialmente pensavo. –
sì, le macro sono molto letterale, quindi vede e altera non un 'fn', ma una chiamata a' fn'. – noisesmith