Как скомпоновать два deftype в новый deftype, если все они находятся в разных файлах?

В реплике работает следующее:

(defprotocol MyProtocol
  (foo [this]))
(deftype A []
  MyProtocol
  (foo [this] "a"))
(deftype B []
  MyProtocol
  (foo [this] "b"))
(deftype C []
  MyProtocol
  (foo [this] (str (foo (A.)) (foo (B.)))))

Когда я пытаюсь переместить каждый экземпляр в отдельный файл, чтобы уменьшить связанность, я получаю следующую ошибку на C: «Невозможно разрешить символ: foo в этом контексте»

Пример макета:

;; my_protocol.clj
(ns my-protocol)
(defprotocol MyProtocol
  (foo [this]))

;; type_a.clj
(ns type-a
  (:require my-protocol :refer [MyProtocol])
(deftype A []
  MyProtocol
  (foo [this] "a"))

;; type_b.clj
(ns type-b
  (:require my-protocol :refer [MyProtocol])
(deftype B []
  MyProtocol
  (foo [this] "b"))

;; type_c.clj
(ns type-c
  (:import [type_a A]
           [type_b B])
  (:require my-protocol :refer [MyProtocol])
(deftype C []
  MyProtocol
  (foo [this] (str (foo (A.)) (foo (B.)))))    

person Jon Bristow    schedule 31.05.2016    source источник
comment
Я думаю, вы имели в виду соединение. Как правило, вы хотите иметь высокую связность и низкую связность. Я не могу проверить прямо сейчас, но я бы попытался сначала полностью квалифицировать foo, например. my-protocol/foo.   -  person coredump    schedule 31.05.2016
comment
Хорошая мысль о сплоченности/сцеплении. Редактирование.   -  person Jon Bristow    schedule 31.05.2016


Ответы (1)


(ns type-a
  (:require my-protocol :refer [MyProtocol])

Вы ссылаетесь на протокол, но никогда на foo, поэтому, когда вы пытаетесь вызвать foo, компилятор не понимает, что вы имеете в виду. Вместо этого напишите:

(ns type-a
  (:require my-protocol :refer [MyProtocol foo])
person amalloy    schedule 31.05.2016
comment
Спасибо! Из большинства руководств, которые я видел, не очень ясно, как выглядит ваше пространство имен после использования defprotocol и deftype. У вас есть ссылка на хорошую, которую мы можем добавить в качестве ссылки для потомков? - person Jon Bristow; 31.05.2016