我意识到以下是一个坏主意,原因有很多。我还意识到,鉴于我的 stackoverflow 代表为 23,因此很自然地假设我是一个学习编程的新手。但是,请幽默我,并专注于“我们如何做到这一点”而不是“你为什么要这样做/你不想这样做”方面。
我想要的是:
(def dog (Dog. ...))
(def cat (Cat. ...))
(with-animal dog
(println (str "Dog: " (speak) "\n")))
(with-animal cat
(println (str "Cat: " (speak) "\n")))
输出:
Dog: woof
Cat: meow
所以基本上,我希望with-animal成为一个宏,所有出现的“speak”函数调用都映射到我正在调用块的对象。
特别是,我不想写:
(let-binding [speak (fn [] "woof")] ...)
(let-binding [speak (fn [] "meow")] ...)
相反,我希望 with-animal 将speak函数映射到我正在调用的对象的某个方法。
在 Clojure 中有没有一种干净的方法可以做到这一点?
谢谢!