Nel documentation of Clojure's type mechanisms, si precisa chePerché la libreria principale Clojure utilizza la derivazione concreta?
- derivazione calcestruzzo è male
- non è possibile derivare tipi di dati da classi concrete, le interfacce solo
Tuttavia, alcuni degli core Clojure classes usano la derivazione del calcestruzzo (t qui sono altri esempi, ma questi sono gli unici casi in cui la superclasse fa parte di una clojure.lang
):
ARef
estendeAReference
Agent
estendeARef
Atom
estendeARef
Namespace
estendeAReference
Ref
estendeARef
Var
estendeARef
Inoltre, ci sono molti classi astratte. Tuttavia, non c'è modo di creare l'equivalente di una classe astratta in Clojure, e per me, l'estensione di una classe astratta sembra avere tutti gli stessi svantaggi della normale derivazione concreta.
Perché viene utilizzata la derivazione del calcestruzzo qui?
La stessa pagina mette in guardia contro la mutabilità e l'incapsulamento, tuttavia le classi in 'clojure.lang' contengono molti campi privati mutabili. Non confondere i dettagli di implementazione interna della lingua con il modo in cui è destinato a essere utilizzato. – Alex
@Alex L'unica ragione che mi interessa è che l'estensione delle interfacce in 'clojure.lang' è il * solo * modo per implementare nuove strutture dati in Clojure compatibili con le funzioni in' clojure.core'. Se tutto in quel pacchetto è veramente solo dettagli di implementazione, non dovrebbe essere richiesta la conoscenza del suo funzionamento per tale estensione. –