【发布时间】:2012-09-29 03:41:33
【问题描述】:
我意识到以下是一个坏主意,原因有很多。我还意识到,鉴于我的 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 是一个宏 s.t.所有出现的“speak”函数调用都映射到我正在调用块的对象。
特别不想写:
(let-binding [speak (fn [] "woof")] ...)
(let-binding [speak (fn [] "meow")] ...)
相反,我希望 with-animal 使 speak 函数映射到我正在调用的对象的某个方法。
在 Clojure 中是否有一种简洁的方法可以做到这一点?
谢谢!
【问题讨论】:
-
我喜欢免责声明 :)
标签: clojure dynamic-scope