Я пишу реализацию структуры данных Trie в Clojure и полагал, что было бы лучше использовать defrecord для создания моего собственного типа, который может перегружать функции, которые работают с коллекциями. Как я могу определить название протокола для расширения, чтобы я мог реализовать функции conj и другие подобные функции для моего нового типа Trie?Какой протокол распространяется для типа Trie?
ответ
Если вы хотите внедрить новую структуру данных, вы захотите использовать deftype
вместо defrecord
, так как последняя проделает определенную реализацию поведения карты для результирующих типов.
Что касается clojure.core
функций коллекции, большинство из них основаны на интерфейсах, а не на протоколах. (ClojureScript делает протоколы использования, однако.) Самый простой способ узнать, какие интерфейсы могут иметь отношение к новой структуре данных для изучения подобных структур данных, которые уже существуют:
;; all superclasses and interfaces of the class of {}, that is,
;; clojure.lang.PersistentArrayMap
(ancestors (class {}))
;; interfaces only
(filter #(.isInterface %) (ancestors (class {})))
Поскольку вы планируете внедрение синтаксического дерева , Я предполагаю, что вы хотите реализовать карту или установить. Если это так, data.avl реализует все соответствующие интерфейсы (и все соответствующие протоколы в версии ClojureScript) - вы могли бы взглянуть на источник.
- 1. Какой протокол обмена использовать?
- 2. Какой протокол аутентификации?
- 3. Какой это протокол UDP?
- 4. Какой протокол использует JMS?
- 5. Какой хороший протокол для передачи файлов?
- 6. Какой протокол использовать для этого приложения?
- 7. Какой протокол выбрать для пошагового игрового сервера
- 8. Какой протокол следует использовать для pyzmq?
- 9. Какой протокол использовать для отправки сообщений JMS?
- 10. Какой протокол использует MFMailComposer для отправки почты?
- 11. Какой протокол AllCast используется для литья tvOS?
- 12. Какой протокол шифрования использует Firebase?
- 13. Репликация Couchdb: какой протокол используется?
- 14. Какой протокол использует Omnipay sagepay?
- 15. Какой протокол будет менее «дорогим»?
- 16. Какой протокол я использую? RTSP?
- 17. Какой протокол обмена сообщениями использовать?
- 18. A Trie to Patricia Trie
- 19. Trie для чисел
- 20. Быстрый выбор типа генератора не распространяется
- 21. Trie implementation - Вставка элементов в trie
- 22. Есть ли какой-либо протокол протокола BitTorrent в дикой природе?
- 23. Какой лучший открытый протокол для программного обеспечения для чатов?
- 24. Trie vs Radix tree vs Patricia trie
- 25. Ошибка: Протокол требует вложенного типа «_BitsType» (Swift.FloatingPointType)
- 26. Параметр типа литерала TypeScript не распространяется для возврата
- 27. класс, который распространяется на общий параметр типа (переменная типа)?
- 28. Trie implementation
- 29. Построение префикса Trie в C++, Suffix Trie
- 30. Какой лучший протокол TCP или UDP?
Отлично, спасибо! У меня есть еще одна проблема, как бы я определил имя и порядок аргументов функций для расширения? Например, я знаю, что 'empty?' Является частью установленного интерфейса, но в java-коде он выглядит как 'empty'. Кроме того, 'cons' принимает последовательность как второй аргумент, но при определении функций в протоколах список аргументов ожидает вместо этого' this' как первого аргумента. Как мне обойти это? – MONODA43
Для интерфейсов 'clojure.lang' вы можете посмотреть исходный код либо самого Clojure, либо библиотеки, которая реализует эти интерфейсы (например, вышеупомянутые data.avl). Для интерфейсов, предоставляемых JDK, имеет смысл читать Javadoc - [вот страница о java.util.Map в JDK 8] (https://docs.oracle.com/javase/8/docs/api/java/ util/Map.html), другие легко доступны. Не имеет значения, в каком порядке пользовательские функции принимают свои аргументы; вам необходимо реализовать методы, объявленные в соответствующих интерфейсах, а функции из 'clojure.core' будут заботиться о их вызове. –
Кроме того, 'empty?' Не соответствует непосредственно любому методу в любом встроенном интерфейсе. Вместо этого он построен из 'not' и' seq' - см. '(Source empty?)'. Метод 'empty', объявленный' clojure.lang.IPersistentCollection', вместо этого соответствует функции 'clojure.core/empty' - см.' (Doc empty) 'для описания того, что он делает. –