2011-07-28 7 views
1

J'utilise rand pour affecter une valeur de champ en tant que fonction :before-save dans clj-record. La fonction random-str ci-dessous est utilisée pour générer la valeur.clj-record: quand est: before-save appelé?

(def VALID-CHARS 
    (map char (concat (range 48 58) ; 0-9 
     (range 65 91) ; A-Z 
     (range 97 123)))) ; a-z 

(defn random-char [] 
    (nth VALID-CHARS (rand (count VALID-CHARS)))) 

(defn random-str [length] 
    (apply str (take length (repeatedly random-char)))) 

Lorsque j'utilise ensuite la carte retournée du CLJ recordcreate functon, la valeur de ce champ est différent de ce qui est dans la base de données. Est-ce que cela signifie qu'il y a une certaine fainéantise d'évaluation paresseuse? Est-ce que random-str est appelé plusieurs fois?

+0

psst. (defn random-char [] (rand-nth VALID-CHARS)) –

Répondre

0

Cela ressemble à un problème avec clj-record. Vous obtenez la paresse dans clojure uniquement avec des séquences paresseuses, ou avec delays. Sinon, clojure est un langage strictement/avidement évalué.

+0

C'était ma suspicion. Je ne vois pas pourquoi rand serait évalué plus d'une fois, à moins qu'il y ait des atomes ou des références utilisés dans le fichier clj-record. Les fonctions impliquées dans les transactions ne devraient pas avoir d'effets secondaires et rand a un état, donc je suppose que je vais le mettre à l'expérience. – edoloughlin

Questions connexes