Quand est-ce que l'utilisation de if-let
plutôt que de let
améliore le rendu du code et a-t-il un impact sur les performances?Quand utiliser let-let-if dans Clojure
Répondre
je suppose que if-let doit être utilisé lorsque vous souhaitez faire référence à une valeur de l'état if
dans la « then
» une partie du code:
-à-dire au lieu de
(let [result :foo]
(if result
(do-something-with result)
(do-something-else)))
vous écrivez:
(if-let [result :foo]
(do-something-with result)
(do-something-else))
qui est un peu plus propre, et vous évite d'indenter un niveau supplémentaire. En ce qui concerne l'efficacité va, vous pouvez voir que l'expansion macro n'ajoute pas de frais généraux:
(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)))
Cela montre aussi que la liaison ne peut être mentionné dans la partie « else
» du code.
Un bon exemple d'utilisation pour if-let
est de supprimer le besoin d'utiliser une anaphore. Par exemple, le langage de programmation Arc fournit une macro appelée aif
qui vous permet de lier une variable spéciale nommée it
dans le corps d'un formulaire if
lorsqu'une expression donnée est évaluée comme étant logique vraie. Nous pouvons créer la même chose dans Clojure:
(defmacro aif [expr & body]
`(let [~'it ~expr] (if ~'it (do [email protected]))))
(aif 42 (println it))
; 42
Ceci est beau et bon, sauf que anaphore ne nichent pas, mais if-let
fait:
(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]
Trouvé très utile. – octopusgrabbus
- 1. Quand dois-je utiliser deftype dans Clojure?
- 2. Quand utiliser `constamment` dans clojure, comment et quand ses arguments sont-ils évalués?
- 3. Comment utiliser Zip dans Clojure?
- 4. Quand utiliser conserver et quand utiliser copier
- 5. Quand utiliser POJO et Quand utiliser SLSB
- 6. Scala classes dans clojure
- 7. récursif (doall) dans clojure
- 8. Quand utiliser un module et quand utiliser une classe
- 9. Quand utiliser l'activateur et quand utiliser la méthode d'usine?
- 10. Quand utiliser/proc et quand/dev
- 11. Hibernate: Quand utiliser getSession() et quand utiliser getCurrentSession()?
- 12. CompositeWPF: EventAggregator - quand utiliser?
- 13. Quand utiliser $ .extend ({...})?
- 14. Quand utiliser [MTAThread]?
- 15. Quand utiliser Hibernate?
- 16. quand utiliser openid.ax.required inopenid
- 17. Quand utiliser GWT ensureInjected()?
- 18. Quand utiliser plus d'activités
- 19. quand utiliser un singleton?
- 20. Quand utiliser reinterpret_cast?
- 21. Quand utiliser DBL_EPSILON/epsilon
- 22. Quand utiliser Parallel.For?
- 23. Rails: quand utiliser l'auto
- 24. Quand utiliser un SQLTransaction
- 25. Quand exactement utiliser UrlEncode?
- 26. Quand utiliser l'opérateur "^"
- 27. Quand utiliser un singleton?
- 28. Quand utiliser l'aide
- 29. Quand utiliser UserControls dans ASp.Net MVC
- 30. Quand utiliser MojoExecutionException vs MojoFailureException dans Maven
De plus, il est impossible d'avoir plus de 2 formes dans le vecteur de liaison de if-let. Par exemple: (si-let [un 20 b nul] (println a)) - ne fonctionne pas! –
Il y a aussi 'when-let'. –