我知道以下做法有很多问题。同时,鉴于我的stackoverflow声望只有23分,人们可能会认为我是一个正在学习编程的新手。但是,请容忍我,并且关注“我们如何做到这一点”,而不是“为什么要这样做/你不应该这样做”的方面。
我想要的是:
所以基本上,我希望with-animal成为一个宏,使得所有“speak”函数调用的出现都映射到我正在调用该块的对象上。
特别地,我不想写:
我想要的是:
(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函数能够映射到我所调用的对象的某个方法,与此相关的是it技术。
在Clojure中是否有一种简洁的方式来实现这个功能呢?
谢谢!