2012-05-22 5 views
2

Clojure позволяет deftype S, которые реализуют интерфейс неполностью, такие какнеполная реализация интерфейсов в Clojure

(deftype Foo [x] clojure.lang.ISeq (next [this] x)) 

(Foo не реализует seq). Исходя из питонской земли утиной печати или, в лучшем случае (или, что хуже всего, в зависимости от вашего POV), ABC, мне трудно понять, почему такие неполные разрешены для реализации, поскольку я думал, что точка интерфейсов должна гарантировать наличие набор методов (как это прямо сейчас, кажется, что безопасно использовать чужие deftype s я должен был бы обернуть каждый вызов метода в try...catch).

ответ

1

Это одно из пересечений между Clojure, философия динамического языка и Java, статическая философия языка. и у меня есть точка смятения между ними, я согласен. Обоснованием было то, что разрешает программам clojure использовать библиотеки Java без какой-либо необоснованной боли, и многие библиотеки требуют от вас передать экземпляр некоторого класса, который реализует метод, чтобы обойти отсутствие функций Java первого класса. С этой точки зрения компромисс имеет смысл, хотя с других точек зрения он не совсем соответствует философии Java.

1

Требование полной реализации поражает интерактивное программирование. Если кто-то предоставляет вам тип, который не полностью реализует ISeq, они дали вам сломанный тип. Тем не менее, линкер/анализатор Clojure, который проверяет ваш источник на предмет реализации, звучит очень полезно.

+0

Уверенный, требующий полной реализации, делает интерактивное программирование сложнее, но как cac вы утверждаете, что реализуете ISeq, когда на самом деле этого не делаете? Я имею в виду, если вам разрешено не полностью реализовывать интерфейс, я могу также утверждать, что моя часть кода реализует все существующие интерфейсы (это просто так часто увеличивает AbstractMethodError). – antony

+0

@atony, я писал Clojure в течение 4 лет. На практике это не проблема. – dnolen

+0

Я предполагаю, что это означает, что протоколы должны действительно считаться формой метаданных и что только протокольные функции являются «реальными»? – antony

Смежные вопросы