У меня есть следующее в одном пространстве имен, говорят shapes
:
(derive ::rect ::shape)
(derive ::square ::rect)
Теперь выполняя следующее в shapes
пространство имен:
(isa? ::square ::shape)
возвраты true
. Но когда я выполняю следующее в пространстве имен, где я на самом деле реализую мультиметоды для рисования,
(isa? ::square ::shape)
это возвращается false
. Таким образом даже при том, что я имею в распоряжении корректные функции отправки мультиметода, я получаю ошибку, которая не говорит "найденной функции отправки".
Я пропускаю что-то? Реализация всех типов форм в одном гигантском пространстве имен кажется бессмысленной мне.
Оказывается, :: использует текущее пространство имен, поэтому для использования типов из других пространств имен вам необходимо использовать полностью определенные имена, такие как: shape / square.
В своем ответе вы правы, что оператор :: находит что-то в текущем пространстве имен.
Интересным моментом является то, что ключевые слова могут быть размещены в любом пространстве имен, которое вам нравится, даже если оно не объявлено ни в одном файле. Так что, если ваше дерево пространства имен сложное, и вы предпочитаете: geometry / square,: geometry / circle и т. Д., Вы можете просто использовать это.
Кроме того, не забывайте, что derive, underive (не используйте underive прямо сейчас), isa? и связанные с ним функции позволяют при желании использовать независимую иерархию. См. Когда и как следует использовать независимые иерархии в clojure?
Вы можете использовать ::
также с псевдонимами пространства имен.
(ns some.other.package
(:require [some.terr.ibly.long.package.name :as short]))
Сейчас: ::short/abc
будет то же самое, что :some.terr.ibly.long.package.name/abc