Во-первых, я новичок в Clojure, поэтому вопрос, скорее всего, будет глупым.
В качестве учебного упражнения у меня работает тривиальная система текстовых приключений. Теперь я хочу перейти от использования ключевых слов к некоторой форме «классности», которая может содержать данные, относящиеся к отдельным экземплярам «мешка», «меча» и т. д.
defrecord
путь сюда?
Вопрос: Можно Я использую производные от Clojure для создания иерархии типов классов дезаписи? похоже на это, но принятый ответ говорит: «Нет, возможно, используйте интерфейсы».
Ответ действительно нет? Должен ли я писать все представления данных в виде классов Java, чтобы использовать мультиметоды Clojure?
Спасибо,
Крис.
Рабочий код:
(derive ::unlit_root ::room)
(derive ::room ::thing)
(derive ::item ::thing)
(derive ::sword ::item)
(derive ::container ::thing)
(derive ::sack ::container)
(derive ::sack ::item)
(derive ::wardrobe ::furniture)
(derive ::furniture ::thing)
(derive ::wardrobe ::furniture)
(defmulti put (fn [x y z] [x y z]))
(defmethod put [::room ::thing ::thing] [x y z] "you can only put items into containers")
(defmethod put [::room ::sword ::sack] [x y z] "the sword cuts the sack")
(defmethod put [::room ::item ::container] [x y z] "ordinary success")
(defmethod put [::unlit_room ::thing ::thing] [x y z] "it's too dark, you are eaten by a grue")
(defmethod put [::room ::sack ::wardrobe] [x y z] "you win")
(defmethod put [::room ::item ::sack] [x y z] "you put it in the sack")
(defmethod put [::room ::furniture ::thing] [x y z] "it's too big to move")
Ниже показано, что я пробовал до сих пор, но я получаю сообщение об ошибке при первом derive
:
ClassCastException java.lang.Class cannot be cast to clojure.lang.Named clojure.core/namespace (core.clj:1496)
.
(defrecord Item [name])
(defrecord Weapon [name, damage])
(defrecord Furniture [name])
(defrecord Container [name])
(defrecord Bag [name])
(derive Weapon Item)
(derive Container Item)
(derive Bag Container)
(derive Furniture Container)
(def sword (Weapon. "sword" 10))
(def apple (Item. "apple"))
(def cupboard (Furniture. "cupboard"))
(def bag (Bag. "bag"))
(defmulti putin (fn [src dst] [src dst]))
(defmethod putin [Item Container] [src dst] :success_0)