2015-01-01 2 views
3

Предупреждение: Я почти уверен, я использую по крайней мере, некоторые из соответствующих терминов неправильныхПродление основных протоколов Clojure

Я хочу изменить flatland.ordered.set.OrderedSet так что nth работ. Я думаю, что это предполагает что-то вроде:

(extend-type flatland.ordered.set.OrderedSet 
    ????? 
    (nth [this n] (nth (vec this) n)) 

Я пытался разглядеть, что протокол определяет nth в течение нескольких часов в настоящее время, не повезло. Есть ли список «родных» протоколов? Я просто перепутался?

ответ

2

В настоящее время невозможно сделать то, что вы хотите, используя extend-type. Постоянные интерфейсы сбора данных Clojure реализуются с использованием интерфейсов Java, а не протоколов Clojure. Поэтому их невозможно расширить, используя extend-type.

Однако, поскольку code является открытым исходным кодом, вы всегда можете изменить библиотеку. Все, что вам нужно сделать, это реализовать nth в OrderedSet's deftype. nth определяется интерфейсом clojure.lang.Indexed.

2

Как говорит Натан Дэвис, вы не можете делать это «извне», потому что этот материал основан на интерфейсах, а не на протоколах. Для OrderedSet было бы разумно реализовать Indexed; Должно быть, я просто не обратил внимания на этот интерфейс.

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


Edit: оглянувшись через код еще раз, я вижу, что nth не так легко правильно реализовать, потому что существование disj делает его трудно быстро сказать, сколько элементов были исключены из множество где. Я не думаю, что эффективная реализация для nth действительно может существовать для этой структуры данных, если вы не удалите возможность использования disj. Таким образом, я, вероятно, не соглашусь с запросом на вытягивание, реализующим nth, если вы не найдете что-то действительно умное, но не стесняйтесь использовать fork ordered и добавьте его в свою собственную вилку, если вам не нужна поддержка disj.

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