Определение мультиметоды Clojure

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

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

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

(isa? ::square ::shape)

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

(isa? ::square ::shape)

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

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

5
задан liwp 20 February 2012 в 20:54
поделиться

3 ответа

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

3
ответ дан 15 December 2019 в 06:15
поделиться

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

Интересным моментом является то, что ключевые слова могут быть размещены в любом пространстве имен, которое вам нравится, даже если оно не объявлено ни в одном файле. Так что, если ваше дерево пространства имен сложное, и вы предпочитаете: geometry / square,: geometry / circle и т. Д., Вы можете просто использовать это.

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

0
ответ дан 15 December 2019 в 06:15
поделиться

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

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

Сейчас: ::short/abc будет то же самое, что :some.terr.ibly.long.package.name/abc

0
ответ дан 15 December 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: