Подтвердить что ты не робот

Является Clojure объектно-ориентированным сердцем? (Полиморфизм в секундах)

Clojure является функциональным lisp, как сообщается, вовсе не объектно-ориентированным, хотя он работает на JVM, VM, предназначенной для объектно-ориентированного языка. Clojure предоставляет идентичные интерфейсы для итерации по спискам и векторам путем абстрагирования их на интерфейс под названием seq. Это даже реализовано внутренне с использованием интерфейса Java ISeq. Это не пример объектно-ориентированной абстракции? Как можно утверждать, что Clojure не является объектно-ориентированным?

Я предполагаю, что следствие этого вопроса --- когда полиморфизм можно считать отличным от объектной ориентации?

4b9b3361

Ответ 1

Idiomatic Clojure способствует определению независимых функций, работающих на очень малом наборе основных структур данных; это разделение методов и данных является сильным утверждением в отношении объектной ориентации и в пользу функционального стиля. Рич Хики (создатель Clojure) неоднократно заявлял о важности этого; например: Clojure избегает традиционного объектно-ориентированного подхода к созданию нового типа данных для каждой новой ситуации, вместо этого предпочитая строить большую библиотеку функций на небольшом наборе типов..

Опора на основные структуры данных еще важнее в Clojure, чем на других функциональных языках, потому что вы будете использовать только преимущества от Clojure STM при использовании постоянных структур данных Clojure.

Я думаю, что следствие этого вопроса --- когда полиморфизм можно считать отличным от объектной ориентации?

Я использую multimethods Clojure (т.е. полиморфные средства) для отправки в разные реализации на основе расширения имени файла - не на всех объектно-ориентированных, а на полиморфных.

Ответ 2

Я предполагаю, что следствие этого вопроса --- когда полиморфизм можно считать отличным от объектной ориентации?

Полиморфизм абсолютно не связан с объектной ориентацией. Это просто означает, что одна и та же операция может вести себя по-разному в зависимости от типа (ов) ее операндов.

Функциональные языки, такие как ML или Haskell, имели полиморфизм более 30 лет, и кто-то, кто лучше знает историю PL, может, вероятно, указать некоторые примеры до 1962 года (то есть pre-OO).

Кристофер Стрэчи описал различие между параметрическим полиморфизмом и ad-hoc-полиморфизмом в 1967 году, поэтому полиморфизм должен был существовать тогда. Поскольку полиморфизм был введен только в ОО в Simula-67, я предполагаю, что полиморфизм должен существовать до того, как он был введен в ОО.

Ответ 3

Имейте в виду, что такие вещи, как ISeq, являются Java.

В Clojure аббревиатура seq - это просто "что-то", которое вы можете предоставить для первой, rest и nth функций (обратите внимание, что вы не вызываете сначала по seq, вы вызываете сначала с аргументом seq). Основные функции языка Clojure работают с коллекциями, seqs или примитивными типами. В открытых интерфейсах нет данных, связанных с методами. Таким образом, реализация Clojure находится в Java, и все взаимодействия с JVM будут включать классы/объекты, но Clojure сам язык не делает.

Связывание методов с структурами данных - это то, что Clojure обескураживает.

Сказав все это... реальность такова, что функции имеют ограничения в отношении того, с какими аргументами они будут работать. первый отдых и nth будут работать только над чем-то, что может быть seq. С этой точки зрения нет большой разницы в том, связаны ли структуры данных с методами или нет - вы все равно должны правильно их подбирать. Большие победы исходят из гибкости. Функции могут быть записаны для принятия любых аргументов и затем составлены с более высокими функциями порядка без определения классов и т.д.:

(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

Ответ 4

Clojures Полиморфизм является натурным расширением Java. В java-методах отправляется в соответствии с классом. В clojure это расширено, чтобы вы могли отправлять вызовы на основе всего, что хотите. Его по-прежнему очень легко рассылать по классу, в большинстве случаев это означает, как это делается. Если вы хотите что-то еще, вы можете написать свой собственный диспетчер. Встроенная функция derive для создания иерархии на основе всего, что вы хотите, а затем отправки на isa.

больше доброты: http://clojure.org/multimethods