2016-12-31 1 views
1

En Clojure pour les braves et vrai, chapitre 8, une fonction appelée if-valid est proposé (puis rejeté) faire abstraction des parties répétitives des contrôles de validation:Précisions sur l'évaluation Clojure

(defn if-valid 
    [record validations success-code failure-code] 
    (let [errors (validate record validations)] 
    (if (empty? errors) 
     success-code 
     failure-code))) 

L'auteur explique que la fonction dans son état ci-dessus ne fonctionnera pas comme success-code et failure-code sera évaluée sur chaque appel if-valid. Ma compréhension est, que le test de la fonction if retournera vrai ou faux, et cela dicte si le code succès ou échec s'exécute. S'il vous plaît quelqu'un peut-il expliquer comment à la fois alors et d'autres parties du if seront évalués pour chaque appel if-valid?

Répondre

3

Supposons que cette fonction est utilisée comme suit:

(if-valid my-data validators 
    (println "Data accepted") 
    (throw (Exception. "Bad data :("))) 

Ce n'est pas bon, parce que les arguments de fonction doivent être évalués avant de pouvoir être transmis à la fonction. Ainsi, les effets secondaires de la première impression "Données acceptées" et ensuite lancer une exception seront tous deux effectués à chaque fois, avant que cette fonction ait une chance d'exécuter des validations du tout.