Существует ли инструмент времени компиляции 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?,

Другие вопросы по тегам