So che gli strumenti clojure.lang.IPersistentVector
del clojure assoc
, come in (assoc [0 1 2 3] 0 -1) ; => [-1 1 2 3]
. Ho anche sentito (come nella risposta this) che il vettore di clojure non implementa dissoc
, come in (dissoc [0 1 2 3] 0) ; => [1 2 3]
. Se questa funzionalità è così facilmente riproducibile utilizzando subvec
, esiste un motivo reale per cui non dovrebbe essere implementato in clojure.lang
, clojure.core
o anche contrib? Se no, c'è qualche ragionamento dietro a questo?Perché non è stato implementato per i vettori in clojure?
6
A
risposta
8
Dissoc non ha molto senso per i vettori per due motivi:
- Il significato di
dissoc
è "rimuovere un tasto". Non è possibile rimuovere una chiave da un vettore senza causare altri effetti collaterali (ad esempio spostando tutti i valori futuri) dissoc
si comporterebbe relativamente male sui vettori se dovesse spostare tutte le chiavi successive - grosso modo O (n) con un bel po ' di GC. Il nucleo di Clojure generalmente evita l'implementazione di operazioni che non sono efficienti/non hanno senso per una particolare struttura di dati.
Fondamentalmente, se ci si trova a voler fare dissoc
su un vettore, si sta probabilmente utilizzando la struttura dati errata. Una hashmap o set persistente è probabilmente una scelta migliore.
Se si desidera una struttura di dati che funziona come un vettore, ma supporta taglio e l'inserimento di elementi o sottosuccessioni in modo efficiente, allora vale la pena di verificare RRB alberi: https://github.com/clojure/core.rrb-vector
Problemi correlati
- 1. Perché atomicAdd non è stato implementato per i doppi?
- 2. Perché non c'è sbirciatina! funzione per i vettori transitori clojure?
- 3. $ non è valido per i vettori atomici
- 4. Ripetizione dei vettori in Clojure
- 5. Perché Hadoop non è implementato usando MPI?
- 6. Perché i vettori sono così poco profondi?
- 7. init (coder :) non è stato implementato in rapida
- 8. Perché JavaScript è stato implementato utilizzando l'ereditarietà prototipale?
- 9. In PHP, perché non è stato implementato echo come funzione? (non echo vs. printf)
- 10. Perché il tipo di dati booleani non è stato implementato in C
- 11. Perché zipWithIndex è implementato in Iterable e non Traversable?
- 12. Perché JML non è implementato come annotazioni in Java?
- 13. Perché gmtime è implementato in questo modo?
- 14. Confronta due vettori in clojure non importa l'ordine delle voci
- 15. Perché java.util.concurrent.atomic.AtomicBoolean è implementato internamente con int?
- 16. Clojure Lazy Sequences che sono Vettori
- 17. Il modello ViewHolder è stato implementato correttamente in CursorAdapter personalizzato?
- 18. Ecto.Queryable non implementato per
- 19. È "per" non effettivamente pigro in clojure?
- 20. Perché Linux memmove() è implementato così com'è?
- 21. Perché le chiavi e le val non funzionano sui vettori?
- 22. Qual è l'uso di Pair Class e perché è stato implementato qui?
- 23. Perché non è andalso/2 implementato come un BIF corretto?
- 24. Perché non è implementato vector :: operator [] simile a map :: operator []?
- 25. Come è implementato perl -i * realmente *?
- 26. perché è: altrimenti no (altro) in clojure?
- 27. In clojure, quello che è un modo efficace per calcolare la media dei vettori di interi
- 28. Perché Microsoft ha implementato i socket in modo diverso?
- 29. Perché JUnit TemporaryFolder non è stato eliminato?
- 30. Come è dynamic_cast implementato