Определение мультиметодов Clojure - PullRequest
5 голосов
/ 17 июня 2010

У меня есть следующее в одном пространстве имен, скажем shapes:

(derive ::rect ::shape)
(derive ::square ::rect)

Теперь выполняю следующее в пространстве имен shapes:

(isa? ::square ::shape)

возвращает true.Но когда я выполняю следующее в пространстве имен, где я фактически реализую мультиметоды для рисования,

(isa? ::square ::shape)

возвращает false.Поэтому, даже если у меня установлены правильные функции мультиметодальной диспетчеризации, я получаю сообщение об ошибке «функция диспетчеризации не найдена».

Я что-то упустил?Реализация всех типов фигур в одном гигантском пространстве имен кажется мне бессмысленной.

Ответы [ 3 ]

3 голосов
/ 17 июня 2010

Оказывается, :: использует текущее пространство имен, поэтому для использования типов из других пространств имен вам необходимо использовать полностью определенные имена, такие как: shape / square.

0 голосов
/ 18 июня 2010

Вы можете использовать :: также с псевдонимами пространства имен.

(ns some.other.package
  (:require [some.terr.ibly.long.package.name :as short]))

Теперь: ::short/abc будет означать то же самое, что и :some.terr.ibly.long.package.name/abc

0 голосов
/ 17 июня 2010

Вы правильно, в своем самоотчете, что оператор :: находит что-то в текущем пространстве имен.

Один интересный момент заключается в том, что ключевые слова могут быть расположены в любом пространстве имен, даже если оно не объявлено ни в одном файле. Поэтому, если ваше дерево пространств имен сложное и вы предпочитаете: геометрию / квадрат, геометрию / круг и т. П., Вы можете просто использовать это.

Кроме того, не забывайте, что производный, неполный вывод (не используйте его сейчас), да? и все связанные функции позволяют вам использовать независимую иерархию, если хотите. См. Когда и как должны использоваться независимые иерархии в clojure?

...