Clojure、方面、定义协议、定义记录

Clojure、方面、定义协议、定义记录,clojure,Clojure,现在,我想让它输出: (defprotocol IAnimal "IAnimal" (report [o] (println (type o) " reporting.\n") (inner-report o) (println (type o) " out.\n"))) (defrecord Dog [] IAnimal (inner-report [o] (println "Woof Woof.\n"))) (defrecord Cat [] IA

现在,我想让它输出:

(defprotocol IAnimal "IAnimal"
  (report [o]
    (println (type o) " reporting.\n")
    (inner-report o)
    (println (type o) " out.\n")))

(defrecord Dog [] IAnimal
  (inner-report [o]
    (println "Woof Woof.\n")))

(defrecord Cat [] IAnimal
  (inner-report [o]
    (println "Meow Meow.\n")))

(defrecord Vampire [] IAnimal
  (inner-report [o]
    (println "I don't sparkle.\n")))
不幸的是,这并没有发生,因为上面的代码没有编译。实现“这一点”的最佳方式是什么

这里的“this”,我的意思是我有一些功能,我想成为协议的一部分,我想对所有记录都有一个实现,我想这个功能能够访问记录实现的专门功能


(clojure的方法是什么?

协议就像Java接口,它们不能为它们的方法提供实现。但这是可行的:

Dog reporting.
Woof Woof.
Dog out.
Cat reporting.
Meow Meow.
Cat out.
Vampire reporting.
I don't sparkle.
Vampire out.

使用
协议
的任何具体原因,因为这可以像编写函数一样简单。我正在Clojure中实现这个绘图库(以SVG显示)。我想要绘制的每个元素(一个defrecord)都会弹出一个锅炉板代码,我更愿意将其粘贴到某个地方(defprotocol似乎是最不常见的倍数)
(defn report [o]
  (println (type o) " reporting.\n")
  (inner-report o)
  (println (type o) " out.\n"))

(defprotocol IAnimal
  "the animal protocol"
  (inner-report [o] "a report"))

(defrecord Dog []
  IAnimal
  (inner-report [o]
    (println "Woof Woof.\n")))

(defrecord Cat []
  IAnimal
  (inner-report [o]
    (println "Meow Meow.\n")))

(defrecord Vampire []
  IAnimal
  (inner-report [o]
    (println "I don't sparkle.\n")))

(report (new Cat))
;; user.Cat reporting.
;; Meow Meow.
;; user.Cat out.