Por que a biblioteca principal do Clojure usa derivação concreta?

9

Na documentação dos mecanismos do tipo Clojure , afirma-se que

  
  • Derivação de concreto é ruim      
    • você não pode derivar tipos de dados de classes concretas, apenas interfaces
    •   
  •   

No entanto, algumas das classes básicas do Clojure usam a derivação concreta são outros exemplos, mas estes são os únicos casos em que a superclasse é parte de clojure.lang ):

  • ARef estende AReference
  • Agent estende ARef
  • Atom estende ARef
  • Namespace estende AReference
  • Ref estende ARef
  • Var estende ARef

Além disso, existem muitas classes abstratas. No entanto, não há como criar o equivalente a uma classe abstrata no Clojure e, para mim, a extensão de uma classe abstrata parece ter todos os mesmos inconvenientes que a derivação concreta regular.

Por que a derivação concreta é usada aqui?

    
por Sam Estep 18.11.2015 в 00:29
fonte

1 resposta

2

Eu não me sinto com autoridade suficiente quando falo das coisas de filosofia, mas aqui estão meus dois centavos.

O motivo pelo qual seu texto citado aparece aqui é para avisar sobre o abuso de defrecord e deftype . O Clojure não encoraja a exposição de registros / tipos como API. Em vez disso, deve-se expor a interface sempre que possível. Afinal, a linguagem OO expõe classes e a linguagem FP expõe funções / métodos / interfaces.

Por outro lado, você mencionou que a própria implementação do clojure usa classes abstratas e as herda. Eu prefiro considerá-los como "as obras sujas que alguém tem que fazer". A JVM é projetada de modo que seja mais eficiente nas primitivas no mundo OO. A lacuna entre a máquina virtual mundial OO e a linguagem do mundo FP tem que ser preenchida por alguém.

    
por Davyzhu 18.11.2015 / 13:04
fonte