我发现以下是一个坏主意,原因很多.我也意识到,鉴于我有一个23的stackoverflow代表,它的本质是假设我是一个新手学习编程.但是,请幽默我,并专注于"我们怎么做",而不是"你为什么要这样做/你不想这样做"的方面.
我想要的是:
(def dog (Dog. ...))
(def cat (Cat. ...))
(with-animal dog
(println (str "Dog: " (speak) "\n")))
(with-animal cat
(println (str "Cat: " (speak) "\n")))
Run Code Online (Sandbox Code Playgroud)
输出:
Dog: woof
Cat: meow
Run Code Online (Sandbox Code Playgroud)
所以基本上,我希望with-animal是一个宏,所有出现的"speak"函数调用都会被映射到我正在调用块的对象.
特别是,我不想写:
(let-binding [speak (fn [] "woof")] ...)
(let-binding [speak (fn [] "meow")] ...)
Run Code Online (Sandbox Code Playgroud)
相反,我希望with-animal将speak函数映射到我正在调用的对象的某个方法.
在Clojure中有一个干净的方法吗?
谢谢!
所以我想首先执行一堆代码,然后询问用户是否要再次执行此操作.我认为最方便的方法是在C++中使用do-while循环,因为我似乎无法在Clojure中找到任何do-while函数,所以我写了以下内容:
(defmacro do-while
"Executes body before testing for truth expression"
[test & body]
`(do (do ~@body) (while ~test ~@body)))
Run Code Online (Sandbox Code Playgroud)
是否有更好的(如在更惯用的Clojure-ish中)编写这个宏的方式,或者可能是一种更好的方式来做我想要的而不经过do-while路线?