Mi piacerebbe sapere come creare una sequenza infinita e impura di valori unici in Clojure.Costruire un generatore di id pigro, impuro
(def generator ...) ; def, not defn
(take 4 generator) ; => (1 2 3 4)
(take 4 generator) ; => (5 6 7 8). note the generator's impurity.
Penso che un tale progetto potrebbe essere più conveniente di ad es. avvolgere un singolo valore intero in un tipo di riferimento e incrementarlo dai suoi utenti, come:
- L'approccio proposto riduce i dettagli di implementazione a un singolo punto di cambiamento: il generatore. Altrimenti tutti i consumatori dovrebbero preoccuparsi sia del tipo di riferimento (
atom
), sia della funzione concreta che fornisce il valore successivo (inc
) - Le sequenze possono trarre vantaggio da molte funzioni clojure.core. 'Manualmente' costruire un elenco di id da un atomo sarebbe un po 'ingombrante:
(take 4 (repeatedly #(swap! _ inc)))
Non sono riuscito a trovare un'implementazione funzionante. È possibile a tutti?
'(più volte gensym)'. Non è quello che stavi cercando, lo so. Oppure: '(ripetutamente # (gensym" "))', genera simboli che sembrano numeri. – Mars
Oppure per i numeri reali: '(ripetutamente # (Long. (Str (gensym" "))))))' – Mars