Существует ли инструмент времени компиляции Clojure, чтобы проверить, действительно ли запись или тип реализует протокол, на который она претендует?
Кажется, что компилятор Clojure не делает этого по умолчанию: проверяет ли компилятор Clojure, реализуют ли протоколы типы записей и типов?
Какие-нибудь, скажем, плагины Lein, которые делают это?
1 ответ
Удивительный core.typed
вводит "опциональную систему типов для Clojure", как вы можете видеть на их официальном сайте.
В частности, вы можете использовать свои собственные defprotocol
макрос ( из core.typed wiki):
Определения протоколов должны использовать clojure.core.typed/defprotocol, синтаксис которого напоминает defprotocol и типизированный fn:
(defprotocol IUnifyWithLVar (unify-with-lvar [v u :- LVar s :- ISubstitutions] :- (U ISubstitutions Fail)))
Полиморфные протоколы поддерживаются:
(defprotocol [a b] Lens (-fetch [l x :- a] :- b) (-putback [l x :- a v :- b] :- a))
После установки вы запускаете его через leiningen с lein typed check
, Очевидным недостатком является то, что вы должны аннотировать свой код. Это плата за повышение безопасности вашего кода с помощью статической проверки типов.
Вас также могут заинтересовать функции satisfies?
, а также instance?
,