oop jvm clojure polymorphism sequences

oop - ¿Está Clojure orientado a objetos en su corazón?(Polimorfismo en seqs)



jvm polymorphism (4)

Supongo que hay un corolario de esta pregunta: ¿cuándo puede considerarse el polimorfismo distinto de la orientación a objetos?

El polimorfismo no tiene absolutamente ninguna relación con la orientación a objetos. Simplemente significa que la misma operación puede comportarse de manera diferente dependiendo del tipo (s) de sus operandos.

Los lenguajes funcionales como ML o Haskell han tenido polimorfismo durante más de 30 años, y alguien con un mejor conocimiento de la historia de PL probablemente puede señalar algunos ejemplos anteriores a 1962 (es decir, pre-OO).

Christopher Strachey describió la distinción entre polimorfismo paramétrico y polimorfismo ad hoc en 1967, por lo que el polimorfismo ya debe haber existido. Dado que el polimorfismo solo se introdujo en OO en Simula-67, supongo que el polimorfismo debe haber existido antes de que se introdujera en OO.

Clojure es un lisp funcional, según se informa, no está orientado en absoluto a los objetos, a pesar de que se ejecuta en la JVM, una máquina virtual diseñada para un lenguaje orientado a objetos. Clojure proporciona interfaces idénticas para iterar sobre listas y vectores al abstraerlos de una interfaz llamada seq. Esto incluso se implementa internamente usando una interfaz Java llamada ISeq. ¿No es esto un ejemplo de abstracción orientada a objetos? ¿Cómo se puede afirmar que Clojure no está orientado a objetos?

Supongo que hay un corolario de esta pregunta: ¿cuándo puede considerarse el polimorfismo distinto de la orientación a objetos?


Clojures Polymorphism es una extensión natrual de Java. En java los métodos se envían de acuerdo a la clase. En detalle, esto se extiende para permitirle enviar llamadas según lo que desee. Todavía es realmente fácil de enviar en clase, de hecho, la mayoría de las veces así es como se hace. Si quieres algo más, puedes escribir tu propio despachador. La función incorporada derive para crear una jerarquía basada en lo que quieras y luego enviar en isa .

más bondad en: http://clojure.org/multimethods


Tenga en cuenta que cosas como ISeq son Java.

En Clojure, la abstracción de seq es en realidad solo ''algo'' que puede proporcionar a las funciones first, rest y nth (tenga en cuenta que no llama primero en un seq, primero llama con un argumento seq). Las funciones básicas del lenguaje Clojure operan en colecciones, seqs o tipos primitivos. No hay datos agrupados con métodos en las interfaces expuestas. Así que la implementación de Clojure está en Java y todas las interoperaciones con JVM implicarán clases / objetos, pero Clojure el lenguaje en sí no.

La combinación de métodos con estructuras de datos es lo que Clojure desalienta.

Habiendo dicho todo eso ... la realidad es que las funciones tienen limitaciones sobre con qué argumentos trabajarán. El primer descanso y el enésimo solo funcionarán en algo que puede ser una secuencia. Desde esta perspectiva, no hay mucha diferencia entre si las estructuras de datos están agrupadas con métodos o no, todavía tiene que hacerlos coincidir correctamente. Los grandes triunfos provienen de la flexibilidad. Las funciones pueden escribirse para tomar cualquier argumento y luego componerse con funciones de orden superior sin definir clases, etc.:

(def farms [{:name "Swansea", :value 100} {:name "Broadmarsh", :value 200, :produce [:corn :wheat :rye]} {:name "Snug", :value 50, :animals [:goats :pigs]}]) (reduce + (map :value farms)) -> 350 (reduce + (map :value (filter :animals farms))) -> 50


Idiomatic Clojure favorece la definición de funciones independientes que operan en un conjunto muy pequeño de estructuras de datos centrales; esta desagregación de métodos y datos es una afirmación fuerte contra la orientación a objetos y en favor de un estilo funcional. Rich Hickey (creador de Clojure) ha declarado repetidamente la importancia de esto; por ejemplo aquí: "Clojure evita el enfoque tradicional orientado a objetos de crear un nuevo tipo de datos para cada nueva situación, en lugar de eso, prefiere construir una gran biblioteca de funciones en un pequeño conjunto de tipos". .

La dependencia de las estructuras de datos principales es aún más importante en Clojure que en otros lenguajes funcionales porque solo obtendrá los beneficios completos de STM de Clojure cuando esté utilizando las estructuras de datos persistentes de Clojure.

Supongo que hay un corolario de esta pregunta: ¿cuándo puede considerarse el polimorfismo distinto de la orientación a objetos?

Estoy usando los métodos múltiples de Clojure (es decir, las instalaciones polimórficas) para enviar a diferentes implementaciones basadas en la extensión de un nombre de archivo, no en absoluto orientadas a objetos, sino polimórficas.