2015-11-17 10 views
9

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 estende AReference
  • Agent estende ARef
  • Atom estende ARef
  • Namespace estende AReference
  • Ref estende ARef
  • Var estende ARef

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?

+0

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

+1

@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. –

risposta

2

Non mi sento abbastanza autoritario quando parlo di cose di filosofia, ma qui ci sono i miei due centesimi.

Il motivo per cui il testo citato appare lì, è quello di avvertire in caso di abuso di defrecord e deftype. Clojure non incoraggia l'esposizione di record/tipi come API. Invece, si dovrebbe esporre l'interfaccia quando possibile. Dopotutto, il linguaggio OO espone le classi e il linguaggio FP espone funzioni/metodi/interfacce.

D'altra parte, hai menzionato l'implementazione di clojure stessa che utilizza classi astratte e le eredita. Preferirei considerarli come "le opere sporche che qualcuno deve fare". JVM è progettato in modo tale da essere più efficiente sui primitivi nel mondo OO. Il divario tra la macchina virtuale del mondo OO e un linguaggio del mondo FP deve essere colmato da qualcuno.

+0

Questo ha senso, ma avrei bisogno di vedere più supporto per il tuo argomento per credere che l'uso di classi astratte qui sia semplicemente un "male necessario" e, senza le caratteristiche di performance della JVM, sarebbe inferiore all'uso di interfacce pure. Sembra proprio che Rich Hickey abbia una ragione molto deliberata qui. –

Problemi correlati