Run Code
|
API
|
Code Wall
|
Misc
|
Feedback
|
Login
|
Theme
|
Privacy
|
Patreon
Improve sync-fn
;;clojure 1.9.0 ; funzione asincrona (defn call-service [arg1 arg2 callback-fn] ; ... fai roba (future (callback-fn (+ arg1 arg2) (- arg1 arg2)))); callback-fn prende 2 argomenti separati! ; funzione sincronizzante, versione del libro: la callback è hardcodata qui, invece di essere un input come lo è per call-service (defn sync-fn-v1 [async-fn] (fn [& args] (let [result (promise)] (apply async-fn (conj (vec args) #(deliver result %&))) ; alternativa che separa gli aspetti puri (fai una lista) da quelli impuri (popola la promise): ;(apply async-fn (conj (vec args) (comp (partial deliver result) list))) ; alternative che ritornano un vettore invece di una lista: ;(apply async-fn (conj (vec args) (comp (partial deliver result) #(vec %&)))) ;(apply async-fn (conj (vec args) (comp (partial deliver result) vector))) @result))) (println ((sync-fn-v1 call-service) 8 7)) ; funzione sincronizzante, versione a cui alludevo: la callback-fn è un input, così abbiamo la stessa API di call-service (al netto del cambio di ordine dei 3 input, ma vabbè) (defn sync-fn-v2 [async-fn callback-fn] (fn [& args] (let [result (promise)] (apply async-fn (conj (vec args) (comp (partial deliver result) callback-fn))) @result))) (println ((sync-fn-v2 call-service vector) 8 7)) (println ((sync-fn-v2 call-service #(apply + %&)) 10 7)) (println ((sync-fn-v2 call-service #(apply * %&)) 10 7)) ; NB: il client è tenuto a fornire a `sync-fn-v2` degli input compatibili. ; Ad esempio, se la funzione asincrona si aspetta una `callback-fn` unaria invece che variadica, (defn call-service-v2 [arg1 arg2 callback-fn] (future (callback-fn (list (+ arg1 arg2) (- arg1 arg2))))); callback-fn prende 1 argomento sequenziale! ; allora le callback devono essere unarie invece che variadiche: (println ((sync-fn-v2 call-service-v2 vec) 8 7)) (println ((sync-fn-v2 call-service-v2 (partial apply +)) 10 7)) (println ((sync-fn-v2 call-service-v2 (partial apply *)) 10 7)) (shutdown-agents)
run
|
edit
|
history
|
help
0
Range List for Clojure