Quando si utilizza if-let
anziché let
, il codice sembra migliore e ha un impatto sulle prestazioni?Quando utilizzare let vs if-let in Clojure
risposta
immagino if-let dovrebbe essere usato quando si desidera fare riferimento il valore di un if
di condizione nel "then
" parte del codice:
cioè invece di
(let [result :foo]
(if result
(do-something-with result)
(do-something-else)))
si scrive:
(if-let [result :foo]
(do-something-with result)
(do-something-else))
che è un po 'più ordinata, e ti fa risparmiare un ulteriore livello. Per quanto riguarda l'efficienza va, si può vedere che la macro di espansione non aggiunge molto in alto:
(clojure.core/let [temp__4804__auto__ :foo]
(if temp__4804__auto__
(clojure.core/let [result temp__4804__auto__]
(do-something-with result))
(do-something-else)))
Questo dimostra anche che il legame non può essere di cui al "else
" parte del codice.
Un caso di utilizzo corretto per if-let
consiste nel rimuovere la necessità di utilizzare anafora. Ad esempio, il linguaggio di programmazione Arc fornisce una macro denominata aif
che consente di associare una variabile speciale denominata it
all'interno del corpo di un modulo if
quando una determinata espressione restituisce true logico. Siamo in grado di creare la stessa cosa in Clojure:
(defmacro aif [expr & body]
`(let [~'it ~expr] (if ~'it (do [email protected]))))
(aif 42 (println it))
; 42
Questo va bene e buono, tranne che anafora non fare il nido, ma if-let
fa:
(aif 42 (aif 38 [it it]))
;=> [38 38]
(aif 42 [it (aif 38 it)])
;=> [42 38]
(if-let [x 42] (if-let [y 38] [x y]))
;=> [42 38]
Trovato molto utile. – octopusgrabbus
- 1. Let vs. Binding in Clojure
- 2. Confuso da "let" in Clojure
- 3. const vs let quando si chiama richiede
- 4. let vs var performance
- 5. let vs letfn per la definizione delle funzioni locali in clojure?
- 6. Associazione di più variabili correlate in Clojure senza let annidato
- 7. Problemi di differenziazione di Rspec "let" vs "let!"
- 8. Clojure: = vs ==
- 9. Javascript ES6 esportazione const vs export let
- 10. Quando utilizzare node.js vs sinatra vs rails?
- 11. Clojure list vs. vector vs. set
- 12. StopWatch vs Timer - Quando utilizzare
- 13. Quando utilizzare EntityManager.find() vs EntityManager.getReference()
- 14. rseq vs reverse in clojure
- 15. Quando utilizzare strtr vs str_replace?
- 16. Quando utilizzare SQLITE_TRANSIENT vs SQLITE_STATIC?
- 17. Quando utilizzare ModelAndView vs Model in primavera?
- 18. Quando utilizzare Cassandra vs. Solr in DSE?
- 19. Quando utilizzare $ stderr vs STDERR in Ruby?
- 20. Quando utilizzare ReleaseComObject vs FinalReleaseComObject?
- 21. Quando utilizzare TaskEx.Run vs. TaskEx.RunEx
- 22. Quando utilizzare ServiceTracker vs ServiceReference
- 23. Quando utilizzare HttpMessageHandler vs ActionFilter?
- 24. Clojure lasciare vs Common Lisp lasciare
- 25. Quando utilizzare Pipe vs Quando utilizzare la memoria condivisa
- 26. Clojure let consente più associazioni con lo stesso nome
- 27. Clojure^float vs. #^float?
- 28. with-meta vs^{} - Clojure
- 29. Clojure apply vs map
- 30. Clojure cercare prestazioni vettore vs set
Inoltre, non è possibile avere più di 2 forme nel vettore vincolante di if-let. Ad esempio: (if-let [a 20 b nil] (println a)) - non funziona! –
C'è anche "quando-lascia". –